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" タグを使用します