Upgrade to Pro — share decks privately, control downloads, hide ads and more …

sqlcとLLMによる型安全なSQL生成

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for 進捗ゼミ 進捗ゼミ
March 20, 2025
260

 sqlcとLLMによる型安全なSQL生成

D-Plus Osaka #2で登壇したときの資料です

Avatar for 進捗ゼミ

進捗ゼミ

March 20, 2025
Tweet

Transcript

  1. type UserRepository interface { GetUserByUserUID(ctx context.Context, tx Tx, userUID string)

    (*entity.User, error) CreateUser(ctx context.Context, tx Tx, userUID string) (*entity.User, error) } これを書いたらあとは自動で完成してほしい!!
  2. interface定義 公式の静的解析ツールが豊富 • "go/ast" • "go/parser" • "go/printer" • "go/token"

    「infraディレクトリ配下のXXXRepositoryという名前のインタ ーフェース」
  3. 生成されたクエリ -- name: GetUserByUserUID :one SELECT id, created_at, updated_at, user_uid

    FROM users WHERE user_uid = $1; -- name: CreateUser :exec INSERT INTO users (created_at, updated_at, user_uid) VALUES (UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), $1);
  4. sqlcの生成物 type User struct { ID int64 CreatedAt int64 UpdatedAt

    int64 UserUid string } const createUser = `-- name: CreateUser :exec INSERT INTO users (created_at, updated_at, user_uid) VALUES (UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), $1)` func (q *Queries) CreateUser(ctx context.Context, userUid string) error { _, err := q.db.ExecContext(ctx, createUser, userUid) return err }
  5. 静的解析による自動プログラミング 「関数の実装が完成した」で終わりではない! • var _ UserRepository = UserRepositoryImpl{}を検出し、 対応するメソッドを置き換える •

    各関数のインポートするパッケージを収集し、importを生成 • 公式のフォーマッタ"golang.org/x/tools/imports"で整形 静的解析なので、確実に自動化が完了する