Open7
GoのSQLクライアントBunを試す
これに沿って進めてみる。
このチュートリアルではSQLiteをIn-Memory DBで使っているので毎回消える。
sqldb, err := sql.Open(sqliteshim.ShimName, "file::memory:?cache=shared")
SQLiteではfile::memory:
でIn-Memory、file:mydata.db
のようにするとファイルに保存できる。
保存されるとCreate Tableでちゃんとエラーになる。
[bun] 21:02:30.667 CREATE TABLE 8.349ms CREATE TABLE "users" ("id" INTEGER NOT NULL, "name" VARCHAR, PRIMARY KEY ("id"))
[bun] 21:02:30.672 INSERT 5.033ms INSERT INTO "users" ("name") VALUES ('admin') RETURNING "id"
[bun] 21:02:30.672 SELECT 0s SELECT "u"."id", "u"."name" FROM "users" AS "u" ORDER BY id ASC LIMIT 10
[{{} 1 admin}]
[bun] 21:02:44.559 CREATE TABLE 0s CREATE TABLE "users" ("id" INTEGER NOT NULL, "name" VARCHAR, PRIMARY KEY ("id")) *sqlite.Error: SQL logic error: table "users" already exists (1)
[bun] 21:02:44.566 INSERT 6.504ms INSERT INTO "users" ("name") VALUES ('admin') RETURNING "id"
[bun] 21:02:44.566 SELECT 0s SELECT "u"."id", "u"."name" FROM "users" AS "u" ORDER BY id ASC LIMIT 10
[{{} 1 admin} {{} 2 admin}]
Insertのとき重複の挿入を許さないようにする方法
_, err := db.NewInsert().
Model(&book).
Ignore().
Exec(ctx)
実行されるSQL
INSERT INTO "books" AS "b" ("id", "name") VALUES (1, 'admin') ON CONFLICT DO NOTHING