Files
db/schema/dialect/duckdb/README.md
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

170 lines
4.2 KiB
Markdown

# DuckDB Schema Dialect
DuckDB schema dialect 为 DuckDB 数据库提供了 DDL (Data Definition Language) 操作支持。
## 功能特性
- ✅ 创建表 (CREATE TABLE)
- ✅ 添加列 (ALTER TABLE ADD COLUMN)
- ✅ 修改列 (ALTER TABLE ALTER COLUMN)
- ✅ 删除列 (ALTER TABLE DROP COLUMN)
- ✅ 删除表 (DROP TABLE)
- ✅ 重命名表 (ALTER TABLE RENAME TO)
- ✅ 表注释 (COMMENT ON TABLE)
- ✅ 列注释 (通过 Comment 属性)
- ✅ 自增主键 (SERIAL/BIGSERIAL)
- ✅ 查询表是否存在
- ✅ 获取表的列列表
## 支持的数据类型
| Schema 类型 | DuckDB 类型 | 说明 |
|------------|-------------|------|
| char | CHAR(n) | 固定长度字符 |
| string | VARCHAR(n) | 可变长度字符串 |
| text | TEXT | 长文本 |
| integer | INTEGER | 整数 |
| bigInteger | BIGINT | 大整数 |
| smallInteger | SMALLINT | 小整数 |
| tinyInteger | TINYINT | 微整数 |
| decimal | DECIMAL(m,d) | 定点数 |
| boolean | BOOLEAN | 布尔值 |
| json | JSON | JSON 数据 |
| binary | BLOB | 二进制数据 |
| datetime | TIMESTAMP | 日期时间 |
| timestamp | TIMESTAMP | 时间戳 |
| date | DATE | 日期 |
| time | TIME | 时间 |
| uuid | UUID | UUID |
## 使用示例
```go
package main
import (
"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 main() {
// 创建数据库连接
db := engine.Open(map[string]engine.DBConfig{
"duckdb": engine.NewDBConfig("duckdb",
engine.WithDuckDBFile("mydb.duckdb"), // 或者 "" 表示内存数据库
),
}).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("更新时间")
// 编译并执行
sqls := s.CompileCreate(bp)
for _, sql := range sqls {
db.Exec(sql)
}
// 添加新列
bp2 := schema.NewBlueprint("users")
bp2.String("phone", 20).Nullable().Comment("电话")
sqls = s.CompileAdd(bp2)
for _, sql := range sqls {
db.Exec(sql)
}
}
```
## DuckDB 特性说明
### 自增主键
DuckDB 使用 `SERIAL` 类型系列实现自增:
- `SERIAL` - 对应 INTEGER 自增
- `BIGSERIAL` - 对应 BIGINT 自增
- `SMALLSERIAL` - 对应 SMALLINT 自增
```go
bp.BigIncrements("id").AutoIncrement()
// 生成: "id" BIGSERIAL NOT NULL PRIMARY KEY
```
### 列修改
DuckDB 的 ALTER COLUMN 操作需要分别执行:
```go
bp.String("name", 100).Change("username")
// 生成多条 SQL:
// 1. ALTER TABLE "users" RENAME COLUMN "name" TO "username"
// 2. ALTER TABLE "users" ALTER COLUMN "username" TYPE VARCHAR(100)
// 3. ALTER TABLE "users" ALTER COLUMN "username" SET NOT NULL
```
### 表注释和列注释
DuckDB 使用标准 SQL 的 COMMENT ON 语法:
```go
bp := schema.NewBlueprint("users")
bp.Comment = "用户表"
// 生成: COMMENT ON TABLE "users" IS '用户表'
```
列注释暂时不支持单独的 COMMENT ON COLUMN 语句。
### 标识符引用
DuckDB 使用双引号引用标识符 (PostgreSQL 风格):
```sql
CREATE TABLE "users" (
"id" BIGSERIAL NOT NULL PRIMARY KEY,
"name" VARCHAR(50) NOT NULL
)
```
## 测试
运行测试:
```bash
# 运行所有测试
go test ./schema/dialect/duckdb/...
# 运行示例测试
go test -v ./schema/dialect/duckdb/... -run Example
# 运行特定测试
go test -v ./schema/dialect/duckdb/... -run TestCompileCreate
```
## 注意事项
1. DuckDB 是分析型数据库,主要用于 OLAP 场景
2. 内存数据库性能优异,适合测试和临时数据处理
3. 支持 PostgreSQL 兼容的大部分语法
4. 不支持所有的 MySQL 特性 (如 UNSIGNED、AUTO_INCREMENT 等)
## 相关链接
- [DuckDB 官方文档](https://duckdb.org/docs/)
- [go-duckdb 驱动](https://github.com/marcboeker/go-duckdb)