Files
db/schema/dialect/duckdb/example_test.go
T
what 2221ca0ddb feat: 新增 DuckDB 方言支持及 SQLite3 自动注册 IF 函数
- 新增 dialect/duckdb 方言,支持 DuckDB SQL 语法
- 新增 schema/dialect/duckdb DDL 操作支持
- dialect/sqlite3: 注册 sqlite3_with_if 驱动,连接时自动注册 IF() 函数
- engine: MakeConnection 对 sqlite3 自动使用带 IF 支持的驱动
- engine: 新增 DBConfig DuckDB 配置项及相关 Option 函数
- 统一各方言测试引用路径
2026-04-16 10:14:46 +08:00

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 '用户信息表'
}