package db import "strings" // quoteMySQLIdent 反引号标识符转义:内部反引号加倍(“),与前端 sql.ts quoteIdent 对齐。 func quoteMySQLIdent(s string) string { return "`" + strings.ReplaceAll(s, "`", "``") + "`" } func quotePGIdent(s string) string { return `"` + strings.ReplaceAll(s, `"`, `""`) + `"` } // quoteIdentFor 按驱动族引用标识符:mysql 反引号加倍、pg/sqlite 双引号加倍、 // mssql 中括号加倍、oracle 沿用原名(大写约定)。 func quoteIdentFor(driver, name string) string { switch { case isMySQLFamily(driver): return quoteMySQLIdent(name) case isMSSQL(driver): return "[" + strings.ReplaceAll(name, "]", "]]") + "]" case driverKey(driver) == "oracle": return name case driverKey(driver) == "sqlite": return quoteSQLiteIdent(name) default: return quotePGIdent(name) } } // quoteTableNameFor 引用表名(支持 schema.table 多段,oracle 除外沿用原名)。 func quoteTableNameFor(driver, table string) string { if driverKey(driver) == "oracle" { return table } parts := strings.Split(table, ".") for i := range parts { parts[i] = quoteIdentFor(driver, parts[i]) } return strings.Join(parts, ".") } func splitSchemaTable(name string) (schema, table string) { name = strings.TrimSpace(name) if i := strings.LastIndex(name, "."); i > 0 { return name[:i], name[i+1:] } return "", name }