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