パラメータの命名

パラメータの命名

sqlcは位置パラメータに対して良い名前を生成しようとしますが、時には十分なコンテキストが不足することがあります。以下のSQLは、理想的とは言えない名前のパラメータを生成します:

-- name: UpsertAuthorName :one
UPDATE author
SET
  name = CASE WHEN $1::bool
    THEN $2::text
    ELSE name
    END
RETURNING *;
type UpdateAuthorNameParams struct {
	Column1   bool   `json:""`
	Column2_2 string `json:"_2"`
}

このような場合、名前付きパラメータを使用することで、Params構造体のフィールド名を制御できます。

-- name: UpsertAuthorName :one
UPDATE author
SET
  name = CASE WHEN sqlc.arg(set_name)::bool
    THEN sqlc.arg(name)::text
    ELSE name
    END
RETURNING *;
type UpdateAuthorNameParams struct {
	SetName bool   `json:"set_name"`
	Name    string `json:"name"`
}

sqlc.arg()構文が冗長だと感じる場合は、@演算子をショートカットとして使用できます。

注意:sqlc.arg()のショートカットとしての@演算子は、MySQLではサポートされていません。

-- name: UpsertAuthorName :one
UPDATE author
SET
  name = CASE WHEN @set_name::bool
    THEN @name::text
    ELSE name
    END
RETURNING *;

NULL可能パラメータ

sqlcは指定されたパラメータのNULL可能性を推論し、多くの場合あなたが期待する通りに動作します。パラメータのNULL可能性をより細かく制御したい場合は、sqlc.narg()nullable arg)を使用してデフォルトの動作をオーバーライドできます。sqlc.nargを使用すると、sqlcは推論されたNULL可能性を無視し、代わりにNULL可能パラメータを生成するよう指示されます。@構文にはNULL可能相当がありません。

以下は、単一のクエリを使用して著者の名前、経歴、またはその両方の更新を可能にする例です。

-- name: UpdateAuthor :one
UPDATE author
SET
 name = coalesce(sqlc.narg('name'), name),
 bio = coalesce(sqlc.narg('bio'), bio)
WHERE id = sqlc.arg('id')
RETURNING *;

以下のコードが生成されます:

type UpdateAuthorParams struct {
	Name sql.NullString
	Bio  sql.NullString
	ID   int64
}

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