データ型

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/sqlNullTime型が使用されます。

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列型に対して[]bytepgtype.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つのステップがあります:

  1. ジオメトリ型に*github.com/twpayne/go-geos.Geomを使用するようにsqlcを設定する。
  2. *github.com/jackc/pgx/v5.Conngithub.com/twpayne/pgx-geos.Registerを呼び出す。
  3. 必要に応じて、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