package schema import ( "fmt" "strings" "sync" "git.fsdpf.net/go/db/v2" ) type Schema interface { // 判断表是否存在 TableExists(table string) (bool, error) // 字段列 GetColumnListing(table string) ([]string, error) // 创建表 CompileCreate(bp *Blueprint) []string // 添加字段 CompileAdd(bp *Blueprint) []string // 修改字段 CompileChange(bp *Blueprint) []string // 删除表 CompileDrop(bp *Blueprint) []string // 删除表, 先判断再删除 CompileDropIfExists(bp *Blueprint) []string // 删除表, 删除列 CompileDropColumn(bp *Blueprint) []string // 表重命名 CompileRename(bp *Blueprint) []string // 生成SQL GenerateSQL(sql string, args ...any) string } var ( dialects = make(map[string]func(db *db.Database) Schema) dialectsMu sync.RWMutex ) func RegisterDialect(name string, sc func(db *db.Database) Schema) { dialectsMu.Lock() defer dialectsMu.Unlock() lowerName := strings.ToLower(name) dialects[lowerName] = sc } func DeregisterDialect(name string) { dialectsMu.Lock() defer dialectsMu.Unlock() delete(dialects, strings.ToLower(name)) } func GetSchemaDialect(db *db.Database) Schema { name := strings.ToLower(db.Dialect()) if d, ok := dialects[name]; ok { return d(db) } panic(fmt.Sprintf("Unsupported driver: %s", name)) }