🖋

SQLBuilderの仕様を考える UPDATE仕様検討編

2024/02/18に公開

目的

GolangのSQLBuilerを作ってみたくて、仕様を考える。
今回はUPDATE文の仕様を考える。

目指す形

ここではusersというTableに対応したUserというTableモデル構造体がある場合とする。
宣言としては、

CREATE TABLE users (
  id int,
  name varchar(10)
)

CREATE TABLE tokens (
  id int,
  user_id int REFERENCES users.id,
  token varchar(10)
)

を想定する

Update

パッケージ名は仮でpkとして

pk.Update(pk.Table("users")).Set("name", "test")

// UPDATE users set name = 'test'

とすることを考えている。

複数カラムに関しては

pk.Update(pk.Table("users")).Set("id", 2).Set("name", "test")

// UPDATE users set id = 2, name = 'test'

また、以下のような連想配列も許可する

um := map[string]interface{}
um["id"] = 2
um["name"] = "test"

pk.Update(pk.Table("users")).SetMap(um)

// UPDATE users set id = 2, name = 'test'

Where句の利用

利用としては以下を想定

pk.Update(pk.Table("users")).Set("name", "test").Where(pk.Eq("id", 1))

// UPDATE users set name = 'test' where id = 1

また、以下のようにも利用できるようにする。

user := pk.Table("users")

pk.Update(users).Set(user.Col("name"), "test").Where(pk.Eq(user.Col("id"), 1))

// UPDATE users set users.name = 'test' where users.id = 1

AS句が利用されても適応される想定はSELECT文の時と同じ

user := pk.Table("users").AS("u")

pk.Update(users).Set(user.Col("name"), "test").Where(pk.Eq(user.Col("id"), 1))

// UPDATE users AS u set u.name = 'test' where u.id = 1
GitHubで編集を提案

Discussion