feat(clients): add nim-allographer client with BaraDB driver support
CI / test (push) Has been cancelled
CI / verify (push) Has been cancelled
Clients CI / build-server (push) Has been cancelled
Clients CI / test-python (push) Has been cancelled
Clients CI / test-javascript (push) Has been cancelled
Clients CI / test-nim (push) Has been cancelled
Clients CI / test-rust (push) Has been cancelled
CI / test (push) Has been cancelled
CI / verify (push) Has been cancelled
Clients CI / build-server (push) Has been cancelled
Clients CI / test-python (push) Has been cancelled
Clients CI / test-javascript (push) Has been cancelled
Clients CI / test-nim (push) Has been cancelled
Clients CI / test-rust (push) Has been cancelled
- Pure Nim wire protocol client (async + sync, no C FFI) - Query Builder: fluent API, SQL generator, execution, transactions - Schema Builder: create/alter/drop tables, column operations - Connection pool with aging and timeout handling - ORM integration via compile-time DB_BARADB switch - Tests: test_open, test_query - Documentation: README.md, PLAN_BARADB.md
This commit is contained in:
@@ -0,0 +1,617 @@
|
||||
discard """
|
||||
cmd: "nim c -d:reset $file"
|
||||
"""
|
||||
|
||||
import std/unittest
|
||||
import std/asyncdispatch
|
||||
import std/json
|
||||
import std/options
|
||||
import ../../src/allographer/schema_builder
|
||||
import ../../src/allographer/query_builder
|
||||
import ./connections
|
||||
import ../clear_tables
|
||||
|
||||
|
||||
let rdb = mysql
|
||||
|
||||
suite("MySQL create table"):
|
||||
test("create table"):
|
||||
rdb.create(
|
||||
table("IntRelation", [
|
||||
Column.increments("id")
|
||||
]),
|
||||
table("StrRelation", [
|
||||
Column.uuid("uuid")
|
||||
]),
|
||||
# text, binary, json column can't use default value and index
|
||||
table("TypeIndex", [
|
||||
Column.increments("id"),
|
||||
Column.integer("integer").unsigned().index().default(1),
|
||||
Column.smallInteger("smallInteger").unsigned().index().default(1),
|
||||
Column.mediumInteger("mediumInteger").unsigned().index().default(1),
|
||||
Column.bigInteger("bigInteger").unsigned().index().default(1),
|
||||
Column.decimal("decimal", 10, 3).unsigned().index().default(1.1),
|
||||
Column.double("double", 10, 3).unsigned().index().default(1.1),
|
||||
Column.float("float").unsigned().index().default(1.1),
|
||||
Column.uuid("uuid").index().default("A"),
|
||||
Column.char("char", 255).index().default("A"),
|
||||
Column.string("string").index().default("A"),
|
||||
Column.text("text"),
|
||||
Column.mediumText("mediumText"),
|
||||
Column.longText("longText"),
|
||||
Column.date("date").index().default(),
|
||||
Column.datetime("datetime").index().default(),
|
||||
Column.time("time").index().default(),
|
||||
Column.timestamp("timestamp").index().default(),
|
||||
Column.timestamps(),
|
||||
Column.softDelete(),
|
||||
Column.binary("binary"),
|
||||
Column.boolean("boolean").index().default(true),
|
||||
Column.enumField("enumField", ["A", "B", "C"]).index().default("A"),
|
||||
Column.json("json"),
|
||||
Column.foreign("int_relation_id").reference("id").onTable("IntRelation").onDelete(SET_NULL),
|
||||
Column.strForeign("str_relation_id").reference("uuid").onTable("StrRelation").onDelete(SET_NULL)
|
||||
]),
|
||||
# text, binary, json column can't use default value, index and unique
|
||||
table("TypeUnique", [
|
||||
Column.increments("id"),
|
||||
Column.integer("integer").unsigned().unique().index().default(1),
|
||||
Column.smallInteger("smallInteger").unsigned().unique().index().default(1),
|
||||
Column.mediumInteger("mediumInteger").unsigned().unique().index().default(1),
|
||||
Column.bigInteger("bigInteger").unsigned().unique().index().default(1),
|
||||
Column.decimal("decimal", 10, 3).unsigned().unique().index().default(1.1),
|
||||
Column.double("double", 10, 3).unsigned().unique().index().default(1.1),
|
||||
Column.float("float").unsigned().unique().index().default(1.1),
|
||||
Column.uuid("uuid").unique().index().default("A"),
|
||||
Column.char("char", 255).unique().index().default("A"),
|
||||
Column.string("string").unique().index().default("A"),
|
||||
Column.text("text"),
|
||||
Column.mediumText("mediumText"),
|
||||
Column.longText("longText"),
|
||||
Column.date("date").unique().index().default(),
|
||||
Column.datetime("datetime").unique().index().default(),
|
||||
Column.time("time").unique().index().default(),
|
||||
Column.timestamp("timestamp").unique().index().default(),
|
||||
Column.timestamps(),
|
||||
Column.softDelete(),
|
||||
Column.binary("binary"),
|
||||
Column.boolean("boolean").unique().index().default(true),
|
||||
Column.enumField("enumField", ["A", "B", "C"]).unique().index().default("A"),
|
||||
Column.json("json"),
|
||||
Column.foreign("int_relation_id").reference("id").onTable("IntRelation").onDelete(SET_NULL),
|
||||
Column.strForeign("str_relation_id").reference("uuid").onTable("StrRelation").onDelete(SET_NULL)
|
||||
])
|
||||
)
|
||||
|
||||
|
||||
test("change columns"):
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.integer("integer").unsigned().index().default(1).change(),
|
||||
Column.smallInteger("smallInteger").unsigned().index().default(1).change(),
|
||||
Column.mediumInteger("mediumInteger").unsigned().index().default(1).change(),
|
||||
Column.bigInteger("bigInteger").unsigned().index().default(1).change(),
|
||||
Column.decimal("decimal", 10, 3).unsigned().index().default(1.1).change(),
|
||||
Column.double("double", 10, 3).unsigned().index().default(1.1).change(),
|
||||
Column.float("float").unsigned().index().default(1.1).change(),
|
||||
Column.uuid("uuid").index().default("A").change(),
|
||||
Column.char("char", 255).index().default("A").change(),
|
||||
Column.string("string").index().default("A").change(),
|
||||
Column.text("text").change(),
|
||||
Column.mediumText("mediumText").change(),
|
||||
Column.longText("longText").change(),
|
||||
Column.date("date").index().default().change(),
|
||||
Column.datetime("datetime").index().default().change(),
|
||||
Column.time("time").index().default().change(),
|
||||
Column.timestamp("timestamp").index().default().change(),
|
||||
Column.binary("binary").change(),
|
||||
Column.boolean("boolean").index().default(true).change(),
|
||||
Column.enumField("enumField", ["A", "B", "C"]).index().default("A").change(),
|
||||
Column.json("json").change(),
|
||||
]),
|
||||
table("TypeUnique", [
|
||||
Column.integer("integer").unsigned().unique().index().default(1).change(),
|
||||
Column.smallInteger("smallInteger").unsigned().unique().index().default(1).change(),
|
||||
Column.mediumInteger("mediumInteger").unsigned().unique().index().default(1).change(),
|
||||
Column.bigInteger("bigInteger").unsigned().unique().index().default(1).change(),
|
||||
Column.decimal("decimal", 10, 3).unsigned().unique().index().default(1.1).change(),
|
||||
Column.double("double", 10, 3).unsigned().unique().index().default(1.1).change(),
|
||||
Column.float("float").unsigned().unique().index().default(1.1).change(),
|
||||
Column.uuid("uuid").unique().index().default("A").change(),
|
||||
Column.char("char", 255).unique().index().default("A").change(),
|
||||
Column.string("string").unique().index().default("A").change(),
|
||||
Column.text("text").change(),
|
||||
Column.mediumText("mediumText").change(),
|
||||
Column.longText("longText").change(),
|
||||
Column.date("date").unique().index().default().change(),
|
||||
Column.datetime("datetime").unique().index().default().change(),
|
||||
Column.time("time").unique().index().default().change(),
|
||||
Column.timestamp("timestamp").unique().index().default().change(),
|
||||
Column.binary("binary").change(),
|
||||
Column.boolean("boolean").unique().index().default(true).change(),
|
||||
Column.enumField("enumField", ["A", "B", "C"]).unique().index().default("A").change(),
|
||||
Column.json("json").change(),
|
||||
])
|
||||
)
|
||||
|
||||
|
||||
suite("error in text, blob, json column for default, index and unique"):
|
||||
suite("create table"):
|
||||
test("text"):
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.text("text").default("A"),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.text("text").index(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.text("text").unique(),
|
||||
])
|
||||
)
|
||||
|
||||
test("mediumText"):
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.mediumText("mediumText").default("A"),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.mediumText("mediumText").index(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.mediumText("mediumText").unique(),
|
||||
])
|
||||
)
|
||||
|
||||
test("longText"):
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.longText("longText").default("A"),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.longText("longText").index(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.longText("longText").unique(),
|
||||
])
|
||||
)
|
||||
|
||||
test("binary"):
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.binary("binary").default("A"),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.binary("binary").index(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.binary("binary").unique(),
|
||||
])
|
||||
)
|
||||
|
||||
test("json"):
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.json("json").default(%*{"key": "value"}),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.json("json").index(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.json("json").unique(),
|
||||
])
|
||||
)
|
||||
|
||||
|
||||
suite("add column"):
|
||||
test("text"):
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.text("text").default("A").add(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.text("text").index().add(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.text("text").unique().add(),
|
||||
])
|
||||
)
|
||||
|
||||
test("mediumText"):
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.mediumText("mediumText").default("A").add(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.mediumText("mediumText").index().add(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.mediumText("mediumText").unique().add(),
|
||||
])
|
||||
)
|
||||
|
||||
test("longText"):
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.longText("longText").default("A").add(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.longText("longText").index().add(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.longText("longText").unique().add(),
|
||||
])
|
||||
)
|
||||
|
||||
test("binary"):
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.binary("binary").default("A").add(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.binary("binary").index().add(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.binary("binary").unique().add(),
|
||||
])
|
||||
)
|
||||
|
||||
test("json"):
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.json("json").default(%*{"key": "value"}).add(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.json("json").index().add(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.json("json").unique().add(),
|
||||
])
|
||||
)
|
||||
|
||||
|
||||
suite("change column"):
|
||||
test("text"):
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.text("text").default("A").change(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.text("text").index().change(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.text("text").unique().change(),
|
||||
])
|
||||
)
|
||||
|
||||
test("mediumText"):
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.mediumText("mediumText").default("A").change(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.mediumText("mediumText").index().change(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.mediumText("mediumText").unique().change(),
|
||||
])
|
||||
)
|
||||
|
||||
test("longText"):
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.longText("longText").default("A").change(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.longText("longText").index().change(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.longText("longText").unique().change(),
|
||||
])
|
||||
)
|
||||
|
||||
test("binary"):
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.binary("binary").default("A").change(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.binary("binary").index().change(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.binary("binary").unique().change(),
|
||||
])
|
||||
)
|
||||
|
||||
test("json"):
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.json("json").default(%*{"key": "value"}).change(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.json("json").index().change(),
|
||||
])
|
||||
)
|
||||
expect DbError:
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.json("json").unique().change(),
|
||||
])
|
||||
)
|
||||
|
||||
|
||||
suite("MySQL alter table"):
|
||||
setup:
|
||||
rdb.create(
|
||||
table("IntRelation", [
|
||||
Column.increments("id"),
|
||||
]),
|
||||
table("StrRelation", [
|
||||
Column.uuid("uuid"),
|
||||
]),
|
||||
table("TypeUnique", [
|
||||
Column.integer("num"),
|
||||
Column.string("str"),
|
||||
]),
|
||||
table("TypeIndex", [
|
||||
Column.integer("num"),
|
||||
Column.string("str"),
|
||||
])
|
||||
)
|
||||
|
||||
|
||||
test("add columns"):
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.increments("id").add(),
|
||||
Column.integer("integer").unsigned().index().default(1).add(),
|
||||
Column.smallInteger("smallInteger").unsigned().index().default(1).add(),
|
||||
Column.mediumInteger("mediumInteger").unsigned().index().default(1).add(),
|
||||
Column.bigInteger("bigInteger").unsigned().index().default(1).add(),
|
||||
Column.decimal("decimal", 10, 3).unsigned().index().default(1.1).add(),
|
||||
Column.double("double", 10, 3).unsigned().index().default(1.1).add(),
|
||||
Column.float("float").unsigned().index().default(1.1).add(),
|
||||
Column.uuid("uuid").index().default("A").add(),
|
||||
Column.char("char", 255).index().default("A").add(),
|
||||
Column.string("string").index().default("A").add(),
|
||||
Column.text("text").add(),
|
||||
Column.mediumText("mediumText").add(),
|
||||
Column.longText("longText").add(),
|
||||
Column.date("date").index().default().add(),
|
||||
Column.datetime("datetime").index().default(),
|
||||
Column.time("time").index().default().add(),
|
||||
Column.timestamp("timestamp").index().default().add(),
|
||||
Column.timestamps().add(),
|
||||
Column.softDelete().add(),
|
||||
Column.binary("binary").add(),
|
||||
Column.boolean("boolean").index().default(true).add(),
|
||||
Column.enumField("enumField", ["A", "B", "C"]).index().default("A").add(),
|
||||
Column.json("json").add(),
|
||||
Column.foreign("int_relation_id").reference("id").onTable("IntRelation").onDelete(SET_NULL).add(),
|
||||
Column.strForeign("str_relation_id").reference("uuid").onTable("StrRelation").onDelete(SET_NULL).add()
|
||||
]),
|
||||
table("TypeUnique", [
|
||||
Column.increments("id").add(),
|
||||
Column.integer("integer").unsigned().unique().index().default(1).add(),
|
||||
Column.smallInteger("smallInteger").unsigned().unique().index().default(1).add(),
|
||||
Column.mediumInteger("mediumInteger").unsigned().unique().index().default(1).add(),
|
||||
Column.bigInteger("bigInteger").unsigned().unique().index().default(1).add(),
|
||||
Column.decimal("decimal", 10, 3).unsigned().unique().index().default(1.1).add(),
|
||||
Column.double("double", 10, 3).unsigned().unique().index().default(1.1).add(),
|
||||
Column.float("float").unsigned().unique().index().default(1.1).add(),
|
||||
Column.uuid("uuid").unique().index().default("A").add(),
|
||||
Column.char("char", 255).unique().index().default("A").add(),
|
||||
Column.string("string").unique().index().default("A").add(),
|
||||
Column.text("text").add(),
|
||||
Column.mediumText("mediumText").add(),
|
||||
Column.longText("longText").add(),
|
||||
Column.date("date").unique().index().default().add(),
|
||||
Column.datetime("datetime").unique().index().default().add(),
|
||||
Column.time("time").unique().index().default().add(),
|
||||
Column.timestamp("timestamp").unique().index().default().add(),
|
||||
Column.timestamps().add(),
|
||||
Column.softDelete().add(),
|
||||
Column.binary("binary").add(),
|
||||
Column.boolean("boolean").unique().index().default(true).add(),
|
||||
Column.enumField("enumField", ["A", "B", "C"]).unique().index().default("A").add(),
|
||||
Column.json("json").add()
|
||||
])
|
||||
)
|
||||
|
||||
|
||||
test("rename column"):
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.renameColumn("num", "num2"),
|
||||
Column.renameColumn("str", "str2"),
|
||||
])
|
||||
)
|
||||
|
||||
let columns = rdb.table("TypeIndex").columns().waitFor
|
||||
check not columns.contains("num")
|
||||
check columns.contains("num2")
|
||||
check not columns.contains("str")
|
||||
check columns.contains("str2")
|
||||
|
||||
|
||||
test("drop column"):
|
||||
rdb.alter(
|
||||
table("TypeIndex", [
|
||||
Column.dropColumn("str")
|
||||
])
|
||||
)
|
||||
|
||||
let columns = rdb.table("TypeIndex").columns().waitFor
|
||||
check not columns.contains("str")
|
||||
|
||||
|
||||
test("rename table"):
|
||||
rdb.drop(
|
||||
table("TypeIndex_renamed")
|
||||
)
|
||||
rdb.table("TypeIndex").insert(%*{"num":1, "str": "a"}).waitFor
|
||||
|
||||
rdb.alter(
|
||||
table("TypeIndex").renameTo("TypeIndex_renamed")
|
||||
)
|
||||
|
||||
var res:Option[JsonNode]
|
||||
try:
|
||||
res = rdb.table("TypeIndex").first().waitFor
|
||||
check not res.isSome
|
||||
except CatchableError:
|
||||
check true
|
||||
|
||||
res = rdb.table("TypeIndex_renamed").first().waitFor
|
||||
check res.isSome
|
||||
|
||||
|
||||
test("drop table"):
|
||||
rdb.create(
|
||||
table("TypeIndex", [
|
||||
Column.integer("num")
|
||||
])
|
||||
)
|
||||
|
||||
rdb.drop(
|
||||
table("TypeIndex")
|
||||
)
|
||||
|
||||
var res:Option[JsonNode]
|
||||
try:
|
||||
res = rdb.table("TypeIndex").first().waitFor
|
||||
check not res.isSome
|
||||
except CatchableError:
|
||||
check true
|
||||
|
||||
|
||||
suite($rdb & " primary"):
|
||||
test("primary key"):
|
||||
rdb.create(
|
||||
table("relation", [
|
||||
Column.increments("id"),
|
||||
]),
|
||||
table("TypeIndex", @[
|
||||
Column.integer("index1"),
|
||||
Column.integer("index2"),
|
||||
Column.string("string"),
|
||||
Column.foreign("relation_id").reference("id").onTable("relation").onDelete(SET_NULL)
|
||||
],
|
||||
primary = @["index1", "index2"]
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
suite("Comment"):
|
||||
test("column comment"):
|
||||
rdb.create(
|
||||
table("Comment", [
|
||||
Column.integer("index1").comment("index1 comment"),
|
||||
Column.string("string").comment("string comment")
|
||||
])
|
||||
)
|
||||
|
||||
|
||||
clearTables(rdb).waitFor()
|
||||
Reference in New Issue
Block a user