データ型
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