Files
db/engine/engine.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

86 lines
1.4 KiB
Go

package engine
import (
"database/sql"
"errors"
"fmt"
"git.fsdpf.net/go/db"
sqlite3dialect "git.fsdpf.net/go/db/dialect/sqlite3"
)
type Engine struct {
configs map[string]DBConfig
dbs map[string]*sql.DB
}
var _engine *Engine
func init() {
_engine = &Engine{
configs: make(map[string]DBConfig),
dbs: make(map[string]*sql.DB),
}
}
func (e Engine) Connection(name string) *db.Database {
cfg, ok := e.configs[name]
if !ok {
panic(errors.New(fmt.Sprintf("Database connection %s not configured.", name)))
}
_db, ok := e.dbs[name]
if !ok {
_db = e.MakeConnection(cfg)
e.dbs[name] = _db
}
return db.New(cfg.Driver, _db)
}
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(driverName, dsn)
if err != nil {
panic(err)
}
if err := db.Ping(); err != nil {
panic(err)
}
return db
}
func Open(cfgs map[string]DBConfig) Engine {
for n, cfg := range cfgs {
_engine.configs[n] = cfg
}
return *_engine
}
func Mock(cfgs map[string]MockDBConfig) Engine {
for k, cfg := range cfgs {
_engine.dbs[k] = cfg.Mock
_engine.configs[k] = DBConfig{Driver: cfg.Driver}
}
return *_engine
}