データ型
sqlcは、内部データベース型をGo型にマッピングする際に合理的なデフォルト選択を行うよう試みています。より複雑な型の選択については以下で説明します。
デフォルトに満足しない場合は、sqlc設定ファイルのoverridesリストを使用して任意の型をオーバーライドできます。
配列
PostgreSQL配列はGoスライスとして実体化されます。
CREATE TABLE places (
name text not null,
tags text[]
);package db
type Place struct {
Name string
Tags []string
}日付と時刻
すべての日付と時刻の型はtime.Time構造体として返されます。null時刻または日付値の場合、database/sqlのNullTime型が使用されます。
pgx/v5 sqlパッケージは適切なpgx型を使用します。
github.com/go-sql-driver/mysqlに依存するMySQLユーザーは、データベース接続文字列にparseTime=trueが追加されていることを確認してください。
CREATE TABLE authors (
id SERIAL PRIMARY KEY,
created_at timestamp NOT NULL DEFAULT NOW(),
updated_at timestamp
);package db
import (
"database/sql"
"time"
)
type Author struct {
ID int
CreatedAt time.Time
UpdatedAt sql.NullTime
}列挙型
PostgreSQL enumsはエイリアスされた文字列型にマップされます。
CREATE TYPE status AS ENUM (
'open',
'closed'
);
CREATE TABLE stores (
name text PRIMARY KEY,
status status NOT NULL
);package db
type Status string
const (
StatusOpen Status = "open"
StatusClosed Status = "closed"
)
type Store struct {
Name string
Status Status
}Null
構造体の場合、null値はdatabase/sqlまたはpgxパッケージの適切な型を使用して表現されます。
CREATE TABLE authors (
id SERIAL PRIMARY KEY,
name text NOT NULL,
bio text
);package db
import (
"database/sql"
)
type Author struct {
ID int
Name string
Bio sql.NullString
}UUID
Go標準ライブラリにはuuidパッケージが含まれていません。UUIDサポートのため、sqlcは優秀なgithub.com/google/uuidパッケージを使用します。pgx/v5 sqlパッケージはpgtype.UUIDを使用します。
CREATE TABLE records (
id uuid PRIMARY KEY
);package db
import (
"github.com/google/uuid"
)
type Author struct {
ID uuid.UUID
}MySQLの場合、ネイティブのuuidデータ型はありません。UUID_TO_BINを使用してUUID()を格納する場合、基底フィールド型はBINARY(16)で、sqlcはデフォルトでこれをsql.NullStringとして解釈します。sqlcがこれらのフィールドを自動的にuuid.UUID型に変換するようにするには、uuidを格納する列でオーバーライドを使用します。
{
"overrides": [
{
"column": "*.uuid",
"go_type": "github.com/google/uuid.UUID"
}
]
}JSON
デフォルトでは、sqlcはJSON列型に対して[]byte、pgtype.JSON、またはjson.RawMessageを生成します。しかし、pgx/v5 sqlパッケージを使用している場合、デフォルト型の代わりに構造体を指定できます。pgx実装は構造体を自動的にマーシャル/アンマーシャルします。
package dto
type BookData struct {
Genres []string `json:"genres"`
Title string `json:"title"`
Published bool `json:"published"`
}CREATE TABLE books (
data jsonb
);{
"overrides": [
{
"column": "books.data",
"go_type": {
"import":"example/db",
"package": "dto",
"type":"BookData"
}
}
]
}package db
import (
"example.com/db/dto"
)
type Book struct {
Data *dto.BookData
}TEXT
PostgreSQLでは、TEXT型の列がある場合、sqlcはデフォルトでそれをGo文字列にマップします。このデフォルトマッピングは、null許可でないTEXT列に適用されます。しかし、null許可のTEXT列の場合、sqlcはpgx/v5ドライバーを使用する際にpgtype.Textにマップします。この区別は、Go アプリケーションでnull値を適切に処理しようとする開発者にとって重要です。
null許可文字列に対応し、それらをGoの*stringにマップするには、sqlc設定でemit_pointers_for_null_typesオプションを使用できます。このオプションは、null許可のSQL列がGoでポインター型として表現されることを保証し、null値と非null値の明確な区別を可能にします。これを行う別の方法は、sqlc設定ファイルでTEXTデータ型をオーバーライドする際にpointer: trueオプションを渡すことです。
ジオメトリ
PostGIS
github.com/twpayne/go-geosの使用(pgx/v5のみ)
sqlcは、GEOSでPostGISジオメトリ型を使用するためにgeosパッケージを使用するように設定できます。
3つのステップがあります:
- ジオメトリ型に
*github.com/twpayne/go-geos.Geomを使用するようにsqlcを設定する。 - 各
*github.com/jackc/pgx/v5.Connでgithub.com/twpayne/pgx-geos.Registerを呼び出す。 - 必要に応じて、SQLに
::geometry型キャストでアノテーションを付ける。
-- Multipolygons in British National Grid (epsg:27700)
create table shapes(
id serial,
name varchar,
geom geometry(Multipolygon, 27700)
);
-- name: GetCentroids :many
SELECT id, name, ST_Centroid(geom)::geometry FROM shapes;{
"version": 2,
"gen": {
"go": {
"overrides": [
{
"db_type": "geometry",
"go_type": {
"import": "github.com/twpayne/go-geos",
"package": "geos",
"pointer": true,
"type": "Geom"
},
"nullable": true
}
]
}
}
}import (
"github.com/twpayne/go-geos"
pgxgeos "github.com/twpayne/pgx-geos"
)
// ...
config.AfterConnect = func(ctx context.Context, conn *pgx.Conn) error {
if err := pgxgeos.Register(ctx, conn, geos.NewContext()); err != nil {
return err
}
return nil
}github.com/twpayne/go-geomの使用
sqlcは、PostGISジオメトリ型を使用するためにgeomパッケージを使用するように設定できます。
-- Multipolygons in British National Grid (epsg:27700)
create table shapes(
id serial,
name varchar,
geom geometry(Multipolygon, 27700)
);
-- name: GetShapes :many
SELECT * FROM shapes;{
"version": "1",
"packages": [
{
"path": "db",
"engine": "postgresql",
"schema": "query.sql",
"queries": "query.sql"
}
],
"overrides": [
{
"db_type": "geometry",
"go_type": "github.com/twpayne/go-geom.MultiPolygon"
},
{
"db_type": "geometry",
"go_type": "github.com/twpayne/go-geom.MultiPolygon",
"nullable": true
}
]
}原文:https://docs.sqlc.dev/en/latest/reference/datatypes.html