From 70b0b5bb9df721a77626fcfa00fc11251cc62458 Mon Sep 17 00:00:00 2001 From: itsumura-h <39766805+itsumura-h@users.noreply.github.com> Date: Tue, 28 Jan 2025 21:41:29 +0900 Subject: [PATCH] 295 insert update for t (#305) * sqlite * postgres * mariadb * mysql * surreal * . * sqlite update * . * postgres update * . * mariadb update * mysql update * surreal update * . --- .../models/mariadb/mariadb_exec.nim | 41 ++++++++++++- .../query_builder/models/mysql/mysql_exec.nim | 40 ++++++++++++- .../models/postgres/postgres_exec.nim | 46 ++++++++++++++- .../models/sqlite/sqlite_exec.nim | 39 +++++++++++- .../models/surreal/surreal_exec.nim | 59 +++++++++++++++++++ tests/mariadb/test_query.nim | 38 +++++++++++- tests/mysql/test_query.nim | 39 +++++++++++- tests/postgres/test_query.nim | 38 +++++++++++- tests/sqlite/test_query.nim | 38 +++++++++++- tests/surrealdb/test_query.nim | 54 ++++++++++++++++- 10 files changed, 423 insertions(+), 9 deletions(-) diff --git a/src/allographer/query_builder/models/mariadb/mariadb_exec.nim b/src/allographer/query_builder/models/mariadb/mariadb_exec.nim index 79aecfbb..9f42e881 100644 --- a/src/allographer/query_builder/models/mariadb/mariadb_exec.nim +++ b/src/allographer/query_builder/models/mariadb/mariadb_exec.nim @@ -3,6 +3,7 @@ import std/json import std/options import std/strformat import std/strutils +import std/sequtils import std/times import ../../libs/mariadb/mariadb_impl import ../../log @@ -426,7 +427,7 @@ proc findPlain*(self:MariadbQuery, id: int, key="id"):Future[seq[string]] {.asyn return self.findPlain($id, key).await -# ==================== insert ==================== +# ==================== insert JsonNode ==================== proc insert*(self:MariadbQuery, items:JsonNode) {.async.} = ## items is `JObject` var sql = self.insertValueBuilder(items) @@ -457,12 +458,50 @@ proc insertId*(self: MariadbQuery, items: seq[JsonNode], key="id"):Future[seq[st self.placeHolder = newJArray() +# ==================== insert Object ==================== +proc insert*[T](self:MariadbQuery, items:T) {.async.} = + var sql = self.insertValueBuilder(%items) + self.log.logger(sql) + self.exec(sql).await + + +proc insert*[T](self:MariadbQuery, items:seq[T]) {.async.} = + let items = items.mapIt(%it) + var sql = self.insertValuesBuilder(items) + self.log.logger(sql) + self.exec(sql).await + + +proc insertId*[T](self:MariadbQuery, items:T, key="id"):Future[string] {.async.} = + var sql = self.insertValueBuilder(%items) + sql.add(&" RETURNING `{key}`") + self.log.logger(sql) + return self.insertId(sql, key).await + + +proc insertId*[T](self: MariadbQuery, items: seq[T], key="id"):Future[seq[string]] {.async.} = + result = newSeq[string](items.len) + for i, item in items: + var sql = self.insertValueBuilder(%item) + sql.add(&" RETURNING `{key}`") + self.log.logger(sql) + result[i] = self.insertId(sql, key).await + self.placeHolder = newJArray() + + +# ==================== update JsonNode ==================== proc update*(self: MariadbQuery, items: JsonNode){.async.} = var sql = self.updateBuilder(items) self.log.logger(sql) self.exec(sql).await +proc update*[T](self: MariadbQuery, items: T){.async.} = + var sql = self.updateBuilder(%items) + self.log.logger(sql) + self.exec(sql).await + + proc delete*(self: MariadbQuery){.async.} = var sql = self.deleteBuilder() self.log.logger(sql) diff --git a/src/allographer/query_builder/models/mysql/mysql_exec.nim b/src/allographer/query_builder/models/mysql/mysql_exec.nim index c9bebc98..a85960cb 100644 --- a/src/allographer/query_builder/models/mysql/mysql_exec.nim +++ b/src/allographer/query_builder/models/mysql/mysql_exec.nim @@ -3,6 +3,7 @@ import std/json import std/options import std/strformat import std/strutils +import std/sequtils import std/times import ../../libs/mysql/mysql_impl import ../../log @@ -429,7 +430,7 @@ proc findPlain*(self:MysqlQuery, id: int, key="id"):Future[seq[string]] {.async. return self.findPlain($id, key).await -# ==================== intert ==================== +# ==================== intert JsonNode ==================== proc insert*(self:MysqlQuery, items:JsonNode) {.async.} = ## items is `JObject` var sql = self.insertValueBuilder(items) @@ -460,12 +461,49 @@ proc insertId*(self: MysqlQuery, items: seq[JsonNode], key="id"):Future[seq[stri self.placeHolder = newJArray() +# ==================== intert Object ==================== +proc insert*[T](self:MysqlQuery, items:T) {.async.} = + var sql = self.insertValueBuilder(%items) + self.log.logger(sql) + self.exec(sql).await + + +proc insert*[T](self:MysqlQuery, items:seq[T]) {.async.} = + let items = items.mapIt(%it) + var sql = self.insertValuesBuilder(items) + self.log.logger(sql) + self.exec(sql).await + + +proc insertId*[T](self:MysqlQuery, items:T, key="id"):Future[string] {.async.} = + var sql = self.insertValueBuilder(%items) + # sql.add(&" RETURNING `{key}`") + self.log.logger(sql) + return self.insertId(sql, key).await + + +proc insertId*[T](self: MysqlQuery, items: seq[T], key="id"):Future[seq[string]] {.async.} = + result = newSeq[string](items.len) + for i, item in items: + var sql = self.insertValueBuilder(%item) + # sql.add(&" RETURNING `{key}`") + self.log.logger(sql) + result[i] = self.insertId(sql, key).await + self.placeHolder = newJArray() + + proc update*(self: MysqlQuery, items: JsonNode){.async.} = var sql = self.updateBuilder(items) self.log.logger(sql) self.exec(sql).await +proc update*[T](self: MysqlQuery, items: T){.async.} = + var sql = self.updateBuilder(%items) + self.log.logger(sql) + self.exec(sql).await + + proc delete*(self: MysqlQuery){.async.} = var sql = self.deleteBuilder() self.log.logger(sql) diff --git a/src/allographer/query_builder/models/postgres/postgres_exec.nim b/src/allographer/query_builder/models/postgres/postgres_exec.nim index 2e666fc1..00b76ba2 100644 --- a/src/allographer/query_builder/models/postgres/postgres_exec.nim +++ b/src/allographer/query_builder/models/postgres/postgres_exec.nim @@ -3,6 +3,7 @@ import std/json import std/options import std/strformat import std/strutils +import std/sequtils import std/times import ../../libs/postgres/postgres_lib import ../../libs/postgres/postgres_impl @@ -453,7 +454,7 @@ proc findPlain*(self:PostgresQuery, id: int, key="id"):Future[seq[string]] {.asy return self.findPlain($id, key).await -# ==================== insert ==================== +# ==================== insert JsonNode ==================== proc insert*(self:PostgresQuery, items:JsonNode) {.async.} = ## items is `JObject` var sql = self.insertValueBuilder(items) @@ -488,6 +489,42 @@ proc insertId*(self: PostgresQuery, items: seq[JsonNode], key="id"):Future[seq[s self.placeHolder = newJArray() +# ==================== insert Object ==================== +proc insert*[T](self:PostgresQuery, items:T) {.async.} = + var sql = self.insertValueBuilder(%items) + sql = questionToDaller(sql) + self.log.logger(sql) + self.exec(sql).await + + +proc insert*[T](self:PostgresQuery, items:seq[T]) {.async.} = + let items = items.mapIt(%it) + var sql = self.insertValuesBuilder(items) + sql = questionToDaller(sql) + self.log.logger(sql) + self.exec(sql).await + + +proc insertId*[T](self:PostgresQuery, items:T, key="id"):Future[string] {.async.} = + var sql = self.insertValueBuilder(%items) + sql.add(&" RETURNING \"{key}\"") + sql = questionToDaller(sql) + self.log.logger(sql) + return self.insertId(sql, key).await + + +proc insertId*[T](self: PostgresQuery, items: seq[T], key="id"):Future[seq[string]] {.async.} = + result = newSeq[string](items.len) + for i, item in items: + var sql = self.insertValueBuilder(%item) + sql.add(&" RETURNING \"{key}\"") + sql = questionToDaller(sql) + self.log.logger(sql) + result[i] = self.insertId(sql, key).await + self.placeHolder = newJArray() + + +# ==================== update ==================== proc update*(self: PostgresQuery, items: JsonNode){.async.} = var sql = self.updateBuilder(items) sql = questionToDaller(sql) @@ -495,6 +532,13 @@ proc update*(self: PostgresQuery, items: JsonNode){.async.} = self.exec(sql).await +proc update*[T](self: PostgresQuery, items: T){.async.} = + var sql = self.updateBuilder(%items) + sql = questionToDaller(sql) + self.log.logger(sql) + self.exec(sql).await + + proc delete*(self: PostgresQuery){.async.} = var sql = self.deleteBuilder() sql = questionToDaller(sql) diff --git a/src/allographer/query_builder/models/sqlite/sqlite_exec.nim b/src/allographer/query_builder/models/sqlite/sqlite_exec.nim index 0caa1620..a32868cc 100644 --- a/src/allographer/query_builder/models/sqlite/sqlite_exec.nim +++ b/src/allographer/query_builder/models/sqlite/sqlite_exec.nim @@ -3,6 +3,7 @@ import std/json import std/options import std/strformat import std/strutils +import std/sequtils import std/times import ../../libs/sqlite/sqlite_impl import ../../log @@ -597,7 +598,7 @@ proc findPlain*(self:SqliteQuery, id: int, key="id"):Future[seq[string]] {.async # return self.find($id, typ, key).await -# ==================== insert ==================== +# ==================== insert JsonNode ==================== proc insert*(self:SqliteQuery, items:JsonNode) {.async.} = let sql = self.insertValueBuilder(items) self.log.logger(sql) @@ -625,12 +626,48 @@ proc insertId*(self: SqliteQuery, items: seq[JsonNode], key="id"):Future[seq[str self.placeHolder = newJArray() +# ==================== insert Object ==================== +proc insert*[T](self:SqliteQuery, items:T) {.async.} = + let sql = self.insertValueBuilder(%items) + self.log.logger(sql) + self.exec(sql).await + + +proc insert*[T](self:SqliteQuery, items:seq[T]) {.async.} = + let items = items.mapIt(%it) + let sql = self.insertValuesBuilder(items) + self.log.logger(sql) + self.exec(sql).await + + +proc insertId*[T](self: SqliteQuery, items: T, key="id"):Future[string] {.async.} = + let sql = self.insertValueBuilder(%items) + self.log.logger(sql) + return self.insertId(sql, key).await + + +proc insertId*[T](self: SqliteQuery, items: seq[T], key="id"):Future[seq[string]] {.async.} = + result = newSeq[string](items.len) + for i, item in items: + let sql = self.insertValueBuilder(%item) + self.log.logger(sql) + result[i] = self.insertId(sql, key).await + self.placeHolder = newJArray() + + +# ==================== update ==================== proc update*(self:SqliteQuery, items:JsonNode) {.async.} = let sql = self.updateBuilder(items) self.log.logger(sql) self.exec(sql).await +proc update*[T](self:SqliteQuery, items:T) {.async.} = + let sql = self.updateBuilder(%items) + self.log.logger(sql) + self.exec(sql).await + + proc delete*(self:SqliteQuery) {.async.} = let sql = self.deleteBuilder() self.log.logger(sql) diff --git a/src/allographer/query_builder/models/surreal/surreal_exec.nim b/src/allographer/query_builder/models/surreal/surreal_exec.nim index 351ce0a7..3620f281 100644 --- a/src/allographer/query_builder/models/surreal/surreal_exec.nim +++ b/src/allographer/query_builder/models/surreal/surreal_exec.nim @@ -338,6 +338,7 @@ proc find*(self: SurrealQuery, id:SurrealId, key="id"):Future[Option[JsonNode]] raise getCurrentException() +# ==================== insert JsonNode ==================== proc insert*(self:SurrealQuery, items:JsonNode) {.async.} = ## https://surrealdb.com/docs/surrealql/statements/insert let sql = self.insertValueBuilder(items) @@ -374,6 +375,45 @@ proc insertId*(self: SurrealQuery, items: seq[JsonNode], key="id"):Future[seq[Su result[i] = SurrealId.new(row[key].getStr) +# ==================== insert Object ==================== +proc insert*[T](self:SurrealQuery, items:T) {.async.} = + ## https://surrealdb.com/docs/surrealql/statements/insert + let sql = self.insertValueBuilder(%items) + self.log.logger(sql) + self.exec(sql).await + + +proc insert*[T](self:SurrealQuery, items:seq[T]) {.async.} = + ## https://surrealdb.com/docs/surrealql/statements/insert + let items = items.mapIt(%it) + var sql = self.insertValuesBuilder(items) + self.log.logger(sql) + self.exec(sql).await + + +proc insertId*[T](self:SurrealQuery, items:T, key="id"):Future[SurrealId] {.async.} = + ## https://surrealdb.com/docs/surrealql/statements/insert + let sql = self.insertValueBuilder(%items) + self.log.logger(sql) + let res = self.getRow(sql).await + if res.isSome(): + return SurrealId.new(res.get()[key].getStr()) + else: + return SurrealId.new() + + +proc insertId*[T](self: SurrealQuery, items: seq[T], key="id"):Future[seq[SurrealId]] {.async.} = + result = newSeq[SurrealId](items.len) + let items = items.mapIt(%it) + var sql = self.insertValuesBuilder(items) + self.log.logger(sql) + let res = self.getAllRows(sql).await + var i = 0 + for row in res.items: + defer: i.inc() + result[i] = SurrealId.new(row[key].getStr) + + proc update*(self: SurrealQuery, items: JsonNode){.async.} = ## https://surrealdb.com/docs/surrealql/statements/update var sql = self.updateBuilder(items) @@ -393,6 +433,25 @@ proc update*(self:SurrealConnections, id:SurrealId, items:JsonNode) {.async.} = surrealQuery.exec(sql).await +proc update*[T](self: SurrealQuery, items: T){.async.} = + ## https://surrealdb.com/docs/surrealql/statements/update + var sql = self.updateBuilder(%items) + self.log.logger(sql) + self.exec(sql).await + + +proc update*[T](self:SurrealConnections, id:SurrealId, items:T) {.async.} = + ## https://surrealdb.com/docs/surrealql/statements/update + let surrealQuery = SurrealQuery.new( + self.log, + self.pools, + newJObject() + ) + let sql = surrealQuery.updateMergeBuilder(id.rawid, %items) + surrealQuery.log.logger(sql) + surrealQuery.exec(sql).await + + proc delete*(self: SurrealQuery){.async.} = ## https://surrealdb.com/docs/surrealql/statements/delete let sql = self.deleteBuilder() diff --git a/tests/mariadb/test_query.nim b/tests/mariadb/test_query.nim index 18aec4cd..d317e131 100644 --- a/tests/mariadb/test_query.nim +++ b/tests/mariadb/test_query.nim @@ -2,7 +2,7 @@ discard """ cmd: "nim c -d:reset -d:ssl -r $file" """ -# nim c -d:reset -d:ssl -r tests/v2/mariadb/test_query.nim +# nim c -d:reset -d:ssl -r tests/mariadb/test_query.nim import std/unittest import std/asyncdispatch @@ -406,6 +406,32 @@ suite($rdb & " insert"): check res.get["email"] == newJNull() + test("insert [T]"): + type User = object + name:string + + let user = User(name: "Alice") + rdb.table("user").insert(user).waitFor + + let row = rdb.table("user").orderBy("id", Desc).first().waitFor().get() + check row["name"].getStr() == "Alice" + + + test("insert seq[T]"): + type User = object + name:string + + let users = @[ + User(name: "Alice"), + User(name: "Bob"), + ] + + rdb.table("user").insert(users).waitFor + let t = rdb.table("user").orderBy("id", Desc).limit(2).get().waitFor() + check t[0]["name"].getStr() == "Bob" + check t[1]["name"].getStr() == "Alice" + + suite($rdb & " update"): setup: setup(rdb) @@ -416,6 +442,16 @@ suite($rdb & " update"): check t["name"].getStr() == "Alice" + test("update [T]"): + type User = object + name:string + + let user = User(name: "Alice") + rdb.table("user").where("id", "=", 1).update(user).waitFor + var t = rdb.table("user").find(1).waitFor().get() + check t["name"].getStr() == "Alice" + + suite($rdb & " delete"): setup(rdb) diff --git a/tests/mysql/test_query.nim b/tests/mysql/test_query.nim index 4dab83a6..7c73880b 100644 --- a/tests/mysql/test_query.nim +++ b/tests/mysql/test_query.nim @@ -2,7 +2,7 @@ discard """ cmd: "nim c -d:reset -d:ssl -r $file" """ -# nim c -d:reset -d:ssl -r tests/v2/mysql/test_query.nim +# nim c -d:reset -d:ssl -r tests/mysql/test_query.nim import std/unittest import std/asyncdispatch @@ -407,6 +407,33 @@ suite($rdb & " insert"): check res.get["email"] == newJNull() + + test("insert [T]"): + type User = object + name:string + + let user = User(name: "Alice") + rdb.table("user").insert(user).waitFor + + let row = rdb.table("user").orderBy("id", Desc).first().waitFor().get() + check row["name"].getStr() == "Alice" + + + test("insert seq[T]"): + type User = object + name:string + + let users = @[ + User(name: "Alice"), + User(name: "Bob"), + ] + + rdb.table("user").insert(users).waitFor + let t = rdb.table("user").orderBy("id", Desc).limit(2).get().waitFor() + check t[0]["name"].getStr() == "Bob" + check t[1]["name"].getStr() == "Alice" + + suite($rdb & " update"): setup: setup(rdb) @@ -417,6 +444,16 @@ suite($rdb & " update"): check t["name"].getStr() == "Alice" + test("update [T]"): + type User = object + name:string + + let user = User(name: "Alice") + rdb.table("user").where("id", "=", 1).update(user).waitFor + var t = rdb.table("user").find(1).waitFor().get() + check t["name"].getStr() == "Alice" + + suite($rdb & " delete"): setup(rdb) diff --git a/tests/postgres/test_query.nim b/tests/postgres/test_query.nim index 7d0482be..23d5f667 100644 --- a/tests/postgres/test_query.nim +++ b/tests/postgres/test_query.nim @@ -2,7 +2,7 @@ discard """ cmd: "nim c -d:reset -d:ssl -r $file" """ -# nim c -d:reset -d:ssl -r tests/v2/postgres/test_query.nim +# nim c -d:reset -d:ssl -r tests/postgres/test_query.nim import std/unittest import std/asyncdispatch @@ -405,6 +405,32 @@ suite($rdb & " insert"): check res.get["email"] == newJNull() + test("insert [T]"): + type User = object + name:string + + let user = User(name: "Alice") + rdb.table("user").insert(user).waitFor + + let row = rdb.table("user").orderBy("id", Desc).first().waitFor().get() + check row["name"].getStr() == "Alice" + + + test("insert seq[T]"): + type User = object + name:string + + let users = @[ + User(name: "Alice"), + User(name: "Bob"), + ] + + rdb.table("user").insert(users).waitFor + let t = rdb.table("user").orderBy("id", Desc).limit(2).get().waitFor() + check t[0]["name"].getStr() == "Bob" + check t[1]["name"].getStr() == "Alice" + + suite($rdb & " update"): setup: setup(rdb) @@ -415,6 +441,16 @@ suite($rdb & " update"): check t["name"].getStr() == "Alice" + test("update [T]"): + type User = object + name:string + + let user = User(name: "Alice") + rdb.table("user").where("id", "=", 1).update(user).waitFor + var t = rdb.table("user").find(1).waitFor().get() + check t["name"].getStr() == "Alice" + + suite($rdb & " delete"): setup(rdb) diff --git a/tests/sqlite/test_query.nim b/tests/sqlite/test_query.nim index a17d6bac..44b0ef0e 100644 --- a/tests/sqlite/test_query.nim +++ b/tests/sqlite/test_query.nim @@ -2,7 +2,7 @@ discard """ cmd: "nim c -d:reset -d:ssl -r $file" """ -# nim c -d:reset -d:ssl -r tests/v2/sqlite/test_query.nim +# nim c -d:reset -d:ssl -r tests/sqlite/test_query.nim import std/unittest import std/asyncdispatch @@ -411,6 +411,32 @@ suite($rdb & " insert"): check res.get["email"] == newJNull() + test("insert [T]"): + type User = object + name:string + + let user = User(name: "Alice") + rdb.table("user").insert(user).waitFor + + let row = rdb.table("user").orderBy("id", Desc).first().waitFor().get() + check row["name"].getStr() == "Alice" + + + test("insert seq[T]"): + type User = object + name:string + + let users = @[ + User(name: "Alice"), + User(name: "Bob"), + ] + + rdb.table("user").insert(users).waitFor + let t = rdb.table("user").orderBy("id", Desc).limit(2).get().waitFor() + check t[0]["name"].getStr() == "Bob" + check t[1]["name"].getStr() == "Alice" + + suite($rdb & " update"): setup: setup(rdb) @@ -421,6 +447,16 @@ suite($rdb & " update"): check t["name"].getStr() == "Alice" + test("update [T]"): + type User = object + name:string + + let user = User(name: "Alice") + rdb.table("user").where("id", "=", 1).update(user).waitFor + var t = rdb.table("user").find(1).waitFor().get() + check t["name"].getStr() == "Alice" + + suite($rdb & " delete"): setup(rdb) diff --git a/tests/surrealdb/test_query.nim b/tests/surrealdb/test_query.nim index 3f9d8381..ffadf245 100644 --- a/tests/surrealdb/test_query.nim +++ b/tests/surrealdb/test_query.nim @@ -2,7 +2,7 @@ discard """ cmd: "nim c -d:reset $file" """ -# nim c -r -d:reset tests/v2/surrealdb/test_query.nim +# nim c -r -d:reset tests/surrealdb/test_query.nim import std/unittest import std/asyncdispatch @@ -352,6 +352,33 @@ suite($rdb & " insert"): res = rdb.table("user").where("email", "is", nil).first().waitFor check res.get["email"] == newJNull() + + + test("insert [T]"): + type User = object + name:string + + let user = User(name: "Alice") + rdb.table("user").insert(user).waitFor + + let row = rdb.table("user").orderBy("index", Desc).first().waitFor().get() + check row["name"].getStr() == "Alice" + + + test("insert seq[T]"): + type User = object + name:string + + let users = @[ + User(name: "Alice"), + User(name: "Bob"), + ] + + rdb.table("user").insert(users).waitFor + let t = rdb.table("user").orderBy("index", Desc).limit(2).get().waitFor() + check t[0]["name"].getStr() == "Bob" + check t[1]["name"].getStr() == "Alice" + suite($rdb & " update"): setup: @@ -366,6 +393,18 @@ suite($rdb & " update"): check user1["name"].getStr() == "Alice" + test("update [T]"): + type User = object + name:string + + let user = User(name: "Alice") + var user1 = rdb.table("user").where("index", "=", 1).first().waitFor().get() + let user1Id = SurrealId.new(user1["id"].getStr()) + rdb.table("user").where("id", "=", user1Id).update(user).waitFor() + user1 = rdb.table("user").find(user1Id).waitFor().get() + check user1["name"].getStr() == "Alice" + + test("update merge"): var user1 = rdb.table("user").where("index", "=", 1).first().waitFor().get() let user1Id = SurrealId.new(user1["id"].getStr()) @@ -374,6 +413,19 @@ suite($rdb & " update"): check user1["name"].getStr() == "updated" + test("update merge [T]"): + type User = object + name:string + + + var user1 = rdb.table("user").where("index", "=", 1).first().waitFor().get() + let user1Id = SurrealId.new(user1["id"].getStr()) + let user = User(name: "updated") + rdb.update(user1Id, user).waitFor() + user1 = rdb.table("user").find(user1Id).waitFor().get() + check user1["name"].getStr() == "updated" + + suite($rdb & " delete"): setup: setup(rdb)