構造体の埋め込み

構造体の埋め込み

埋め込み機能により、既存のモデル構造体をより多くのクエリで再利用できるようになり、手動でのシリアル化作業が減少します。まず、学生とテストスコアを持つ以下のスキーマを想像してください。

CREATE TABLE students (
  id   bigserial PRIMARY KEY,
  name text NOT NULL,
  age  integer NOT NULL
);

CREATE TABLE test_scores (
  student_id bigint NOT NULL,
  score      integer NOT NULL,
  grade      text NOT NULL
);

学生レコードとテストで取得したスコアを選択したいとします。通常は以下のように行います:

-- name: ScoreAndTests :many
SELECT students.*, test_scores.*
FROM students
JOIN test_scores ON test_scores.student_id = students.id
WHERE students.id = $1;

Goを使用している場合、sqlcは以下のような構造体を生成します:

type ScoreAndTestsRow struct {
	ID        int64
	Name      string
	Age       int32
	StudentID int64
	Score     int32
	Grade     string
}

埋め込み機能を使用すると、構造体には平坦化された列のリストの代わりに、両方のテーブルのモデルが含まれます。

-- name: ScoreAndTests :many
SELECT sqlc.embed(students), sqlc.embed(test_scores)
FROM students
JOIN test_scores ON test_scores.student_id = students.id
WHERE students.id = $1;
type ScoreAndTestsRow struct {
	Student   Student
	TestScore TestScore
}

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