Table
Table モデルは View モデルの拡張で、データベースへの書き込み操作(Insert、Update、Delete)を追加でサポートします。
基本的な使い方
Table モデルを作成するには、NewTable()
関数を使用します:
type User struct {
ID int `db:",pk"`
VehicleID int
Name string
Email string
}
type UserSetter struct {
ID omit.Val[int]
VehicleID omit.Val[int]
Name omit.Val[string]
Email omit.Val[string]
}
var userTable = psql.NewTable[User, UserSetter]("public", "users")
Why do we need a setter?
セッター構造体は、部分的な更新を可能にするために必要です。omit.Val[T]
型を使用することで、フィールドが設定されているかどうかを区別できます。
- 設定されていないフィールドは UPDATE 文に含まれません
- NULL 値と未設定の値を区別できます
- 型安全な部分更新が可能になります
Queries
Table モデルは View モデルのすべてのクエリメソッドを継承しています:
// 単一のユーザーを取得
user, err := userTable.Query().
Where(psql.Quote("id").EQ(psql.Arg(1))).
One(ctx, db)
// 複数のユーザーを取得
users, err := userTable.Query().
Where(psql.Quote("active").EQ(psql.Arg(true))).
All(ctx, db)
Insert
単一のレコードを挿入します:
user := UserSetter{
VehicleID: omit.From(123),
Name: omit.From("John Doe"),
Email: omit.From("john@example.com"),
}
insertedUser, err := userTable.Insert(ctx, db, user)
Insert Many
複数のレコードを一度に挿入します:
users := []UserSetter{
{
Name: omit.From("Alice"),
Email: omit.From("alice@example.com"),
},
{
Name: omit.From("Bob"),
Email: omit.From("bob@example.com"),
},
}
insertedUsers, err := userTable.InsertMany(ctx, db, users)
Update
条件に一致するレコードを更新します:
user := UserSetter{
Name: omit.From("Updated Name"),
Email: omit.From("updated@example.com"),
}
updatedCount, err := userTable.Update(ctx, db, user).
Where(psql.Quote("id").EQ(psql.Arg(1))).
Exec()
Update Many
複数のレコードを更新します:
user := UserSetter{
VehicleID: omit.From(456),
}
updatedCount, err := userTable.UpdateMany(ctx, db, user).
Where(psql.Quote("active").EQ(psql.Arg(false))).
Exec()
Upsert
レコードが存在する場合は更新、存在しない場合は挿入します:
user := UserSetter{
ID: omit.From(1),
Name: omit.From("John Doe"),
Email: omit.From("john@example.com"),
}
upsertedUser, err := userTable.Upsert(ctx, db, user)
Delete
条件に一致するレコードを削除します:
deletedCount, err := userTable.Delete(ctx, db).
Where(psql.Quote("id").EQ(psql.Arg(1))).
Exec()
Delete Many
複数のレコードを削除します:
deletedCount, err := userTable.DeleteMany(ctx, db).
Where(psql.Quote("active").EQ(psql.Arg(false))).
Exec()
Tips
omit.From()
を使用して値を設定しますomit.Val[T]
が空の場合、そのフィールドは操作に含まれません- 各データベース方言(PostgreSQL、MySQL、SQLite)で同じインターフェースを使用できます
- 主キーには
db:",pk"
タグを使用します