- 新增 dialect/duckdb 方言,支持 DuckDB SQL 语法 - 新增 schema/dialect/duckdb DDL 操作支持 - dialect/sqlite3: 注册 sqlite3_with_if 驱动,连接时自动注册 IF() 函数 - engine: MakeConnection 对 sqlite3 自动使用带 IF 支持的驱动 - engine: 新增 DBConfig DuckDB 配置项及相关 Option 函数 - 统一各方言测试引用路径
147 lines
3.3 KiB
Go
147 lines
3.3 KiB
Go
package duckdb_test
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"git.fsdpf.net/go/db/engine"
|
|
"git.fsdpf.net/go/db/schema"
|
|
|
|
_ "git.fsdpf.net/go/db/dialect/duckdb"
|
|
_ "git.fsdpf.net/go/db/schema/dialect/duckdb"
|
|
_ "github.com/marcboeker/go-duckdb"
|
|
)
|
|
|
|
func Example_createTable() {
|
|
// 创建内存数据库连接
|
|
db := engine.Open(map[string]engine.DBConfig{
|
|
"duckdb": engine.NewDBConfig("duckdb",
|
|
engine.WithDuckDBFile(""), // 空字符串表示内存数据库
|
|
),
|
|
}).Connection("duckdb")
|
|
|
|
// 获取 schema 方言实现
|
|
s := schema.GetSchemaDialect(db)
|
|
|
|
// 创建表结构定义
|
|
bp := schema.NewBlueprint("users")
|
|
bp.Create()
|
|
|
|
bp.BigIncrements("id").AutoIncrement().Comment("用户ID")
|
|
bp.String("name", 50).Comment("用户名")
|
|
bp.String("email", 100).Comment("邮箱")
|
|
bp.Integer("age").Nullable().Comment("年龄")
|
|
bp.Boolean("active").Default("1").Comment("是否激活")
|
|
bp.Timestamp("created_at").UseCurrent().Comment("创建时间")
|
|
bp.Timestamp("updated_at").UseCurrent().Comment("更新时间")
|
|
|
|
// 编译生成 CREATE TABLE SQL
|
|
sqls := s.CompileCreate(bp)
|
|
for _, sql := range sqls {
|
|
fmt.Println(sql)
|
|
}
|
|
|
|
// Output:
|
|
// CREATE TABLE "users" (
|
|
// "id" BIGSERIAL NOT NULL PRIMARY KEY,
|
|
// "name" VARCHAR(50) NOT NULL,
|
|
// "email" VARCHAR(100) NOT NULL,
|
|
// "age" INTEGER NULL,
|
|
// "active" BOOLEAN NOT NULL DEFAULT '1',
|
|
// "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
// "updated_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
// )
|
|
}
|
|
|
|
func Example_addColumn() {
|
|
db := engine.Open(map[string]engine.DBConfig{
|
|
"duckdb": engine.NewDBConfig("duckdb",
|
|
engine.WithDuckDBFile(""),
|
|
),
|
|
}).Connection("duckdb")
|
|
|
|
s := schema.GetSchemaDialect(db)
|
|
|
|
// 添加新列
|
|
bp := schema.NewBlueprint("users")
|
|
bp.String("phone", 20).Nullable().Comment("电话号码")
|
|
bp.Text("address").Nullable().Comment("地址")
|
|
|
|
sqls := s.CompileAdd(bp)
|
|
for _, sql := range sqls {
|
|
fmt.Println(sql)
|
|
}
|
|
|
|
// Output:
|
|
// ALTER TABLE "users"
|
|
// ADD COLUMN "phone" VARCHAR(20) NULL,
|
|
// ADD COLUMN "address" TEXT NULL
|
|
}
|
|
|
|
func Example_dropColumn() {
|
|
db := engine.Open(map[string]engine.DBConfig{
|
|
"duckdb": engine.NewDBConfig("duckdb",
|
|
engine.WithDuckDBFile(""),
|
|
),
|
|
}).Connection("duckdb")
|
|
|
|
s := schema.GetSchemaDialect(db)
|
|
|
|
// 删除列
|
|
bp := schema.NewBlueprint("users")
|
|
bp.DropColumn("phone", "address")
|
|
|
|
sqls := s.CompileDropColumn(bp)
|
|
for _, sql := range sqls {
|
|
fmt.Println(sql)
|
|
}
|
|
|
|
// Output:
|
|
// ALTER TABLE "users"
|
|
// DROP COLUMN "phone",
|
|
// DROP COLUMN "address"
|
|
}
|
|
|
|
func Example_renameTable() {
|
|
db := engine.Open(map[string]engine.DBConfig{
|
|
"duckdb": engine.NewDBConfig("duckdb",
|
|
engine.WithDuckDBFile(""),
|
|
),
|
|
}).Connection("duckdb")
|
|
|
|
s := schema.GetSchemaDialect(db)
|
|
|
|
// 重命名表
|
|
bp := schema.NewBlueprint("users")
|
|
bp.Rename("customers")
|
|
|
|
sqls := s.CompileRename(bp)
|
|
for _, sql := range sqls {
|
|
fmt.Println(sql)
|
|
}
|
|
|
|
// Output:
|
|
// ALTER TABLE "users" RENAME TO "customers"
|
|
}
|
|
|
|
func Example_modifyComment() {
|
|
db := engine.Open(map[string]engine.DBConfig{
|
|
"duckdb": engine.NewDBConfig("duckdb",
|
|
engine.WithDuckDBFile(""),
|
|
),
|
|
}).Connection("duckdb")
|
|
|
|
s := schema.GetSchemaDialect(db)
|
|
|
|
// 修改表注释
|
|
bp := schema.NewBlueprint("users")
|
|
bp.Comment = "用户信息表"
|
|
|
|
sqls := s.CompileModifyComment(bp)
|
|
for _, sql := range sqls {
|
|
fmt.Println(sql)
|
|
}
|
|
|
|
// Output:
|
|
// COMMENT ON TABLE "users" IS '用户信息表'
|
|
}
|