🤹
【Go】sqlcの「 sqlc.embed」を外部結合で使用した時の動作(v1.29.0時点)
概要
SQLクエリから型を生成するツールsqlcですが、Embedding structsのドキュメントにある通り、sqlc.embed
というマクロを使うと対象のテーブルをstructとして括って型生成してくれます。
これはjoinした時の結果を取得する際のユースケースを主に想定されていますが、では外部結合の場合はどういう動作をするか試してみたのでメモ書きします。
前提
- 使用したsqlcのバージョンは
v1.29.0
です。
試してみた結果
以下のようなクエリを用意します。
-- name: SelectTaskDefinitionList :many
select
def.*,
sqlc.embed(task_category)
from
task_definition def
left outer join task_category on
task_category.id = def.category_id
想定としては、task_category
のテーブルがポインタ型として出力してほしいのですが、結果としては以下のようにポインタ型になりませんでした。
type SelectTaskDefinitionListRow struct {
ID string
Title string
CategoryID *string
Detail *string
TaskCategory TaskCategory
}
結論など
2025年5月時点で、この動作はsqlc.embed(<right_join_table>) should generate NULLable fields in LEFT/RIGHT JOINでissueとして挙がっていました。ので、動作としては今後改善されそうな感じですがいつになるか現時点では未定っぽいです。
なお、sqlc.embed
使わずに列指定でクエリを書けばポインタ型になるので、そこまですぐに改善が必要かと言われると微妙ではありますが。。
Discussion