型のオーバーライド

型のオーバーライド

多くの場合、クエリの入力や出力に使用したいGo型をsqlcに明示的に指定することが有用です。例えば、PostgreSQLのUUID型は、pgx/v5を使用する場合、デフォルトでgithub.com/jackc/pgx/pgtypeUUIDにマップされますが、代わりにgithub.com/google/uuidUUIDを使用したい場合があります。

sqlcに別のGo型を使用させたい場合は、overridesリストでパッケージのimportパスと型を指定します。

version: "2"
sql:
- schema: "postgresql/schema.sql"
  queries: "postgresql/query.sql"
  engine: "postgresql"
  gen:
    go: 
      package: "authors"
      out: "db"
      sql_package: "pgx/v5"
      overrides:
        - db_type: "uuid"
          go_type:
            import: "github.com/google/uuid"
            type: "UUID"

overridesリスト

overridesリストの各要素には以下のキーがあります:

  • db_type:
    • オーバーライドするデータベース型。サポートされる型の完全なリストはpostgresql_type.goまたはmysql_type.goで確認できます。Postgresの場合、利用可能な場合はpg_catalog-prefixed名を使用する必要があります。db_typecolumnは相互排他的です。
  • column:
    • オーバーライドする列名。値はtable.columnの形式である必要がありますが、schema.table.columnまたはcatalog.schema.table.columnを指定することもできます。columndb_typeは相互排他的です。
  • go_type:
    • 生成されたコードで使用するGo型の完全修飾名。通常は文字列ですが、より複雑な設定の場合はマップにすることもできます。
  • go_struct_tag:
    • 生成されたコードで使用するreflectスタイルの構造体タグ。例:a:"b" x:"y,z"。すべてのフィールドにjsonまたはdbタグが必要な場合は、代わりにemit_json_tagsまたはemit_db_tagsを使用してください。
  • unsigned:
    • trueの場合、数値のdb_typeが符号なしの場合にこのオーバーライドが適用されます。これはcolumnオーバーライドには影響しません。デフォルトはfalseです。
  • nullable:
    • trueの場合、列がnullable(NULL許可)の場合にこのオーバーライドが適用されます。そうでなければ、列がnon-nullable(NULL不許可)の場合にこのオーバーライドが適用されます。これはcolumnオーバーライドには影響しません。デフォルトはfalseです。

単一のdb_typeオーバーライド設定は、nullableまたはnon-nullable列のいずれかに適用されますが、両方には適用されません。両方のケースで同じGo型をオーバーライドしたい場合は、2つのオーバーライドを設定する必要があります。

コード生成時、columnキーを使用するエントリは、db_typeキーを使用するエントリよりも常に優先されます。

go_typeマップ

一部のオーバーライドには、より詳細な設定が必要な場合があります。必要に応じて、go_typeは以下のキーを持つマップにできます:

  • import:
    • 型が定義されているパッケージのimportパス。
  • package:
    • 型が定義されているパッケージ名。これは、importパスが希望するパッケージ名で終わらない場合にのみ必要です。
  • type:
    • パッケージプレフィックスなしの型名自体。
  • pointer:
    • trueの場合、生成されたコードは型自体ではなく型へのポインターを使用します。
  • slice:
    • trueの場合、生成されたコードは型自体ではなく型のスライスを使用します。

例:

version: "2"
sql:
- schema: "postgresql/schema.sql"
  queries: "postgresql/query.sql"
  engine: "postgresql"
  gen:
    go: 
      package: "authors"
      out: "db"
      sql_package: "pgx/v5"
      overrides:
        - db_type: "uuid"
          go_type:
            import: "a/b/v2"
            package: "b"
            type: "MyType"
            pointer: true

原文:https://docs.sqlc.dev/en/latest/howto/overrides.html