🤹

【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