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 函数
- 统一各方言测试引用路径
This commit is contained in:
2026-04-16 10:14:46 +08:00
parent c4590cf592
commit 2221ca0ddb
19 changed files with 1270 additions and 62 deletions
+6 -7
View File
@@ -2,15 +2,11 @@ package engine
import (
"database/sql"
"errors"
"fmt"
_ "git.fsdpf.net/go/db/dialect/mysql"
_ "git.fsdpf.net/go/db/dialect/postgres"
_ "git.fsdpf.net/go/db/dialect/sqlite3"
_ "git.fsdpf.net/go/db/dialect/sqlserver"
"git.fsdpf.net/go/db"
"git.fsdpf.net/go/db/internal/errors"
sqlite3dialect "git.fsdpf.net/go/db/dialect/sqlite3"
)
type Engine struct {
@@ -47,16 +43,19 @@ func (e Engine) Connection(name string) *db.Database {
func (e Engine) MakeConnection(cfg DBConfig) (db *sql.DB) {
dsn := cfg.ToDSN()
driverName := cfg.Driver
switch cfg.Driver {
case "mysql":
case "sqlite3":
driverName = sqlite3dialect.DriverWithIF
case "sqlserver":
case "postgres":
case "duckdb":
default:
panic(fmt.Sprintf("Unsupported driver: %s", cfg.Driver))
}
db, err := sql.Open(cfg.Driver, dsn)
db, err := sql.Open(driverName, dsn)
if err != nil {
panic(err)