fix(migrator): honor DatabaseURL connection string in v3 migrator

The v3->v4 migrator built its DSN from component fields only, ignoring
DatabaseURL - so configs that set only a connection string (required
for postgres unix sockets, e.g. "host=/var/run/postgresql dbname=...")
fell back to a host/port DSN and failed to connect. The migrator now
reads DatabaseURL and passes it to gorm verbatim, matching the main
client. Closes #42.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
pull/3582/head
Tomas Dvorak 2 weeks ago
parent 395b708b9d
commit e1575e3d97

@ -18,6 +18,7 @@ type database struct {
Port int Port int
Charset string Charset string
UnixSocket bool UnixSocket bool
DatabaseURL string
} }
// system 系统通用配置 // system 系统通用配置

@ -34,36 +34,47 @@ func Init() error {
confDBType = "mysql" confDBType = "mysql"
} }
switch confDBType { // A full connection string overrides component fields - required for
case "UNSET", "sqlite": // postgres unix sockets ("host=/var/run/postgresql dbname=..."), which
// 未指定数据库或者明确指定为 sqlite 时,使用 SQLite 数据库 // the component fields cannot express.
db, err = gorm.Open("sqlite3", util.RelativePath(conf.DatabaseConfig.DBFile)) if conf.DatabaseConfig.DatabaseURL != "" {
case "postgres": dialect := confDBType
db, err = gorm.Open(confDBType, fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=disable", if dialect == "UNSET" || dialect == "sqlite" {
conf.DatabaseConfig.Host, dialect = "sqlite3"
conf.DatabaseConfig.User, }
conf.DatabaseConfig.Password, db, err = gorm.Open(dialect, conf.DatabaseConfig.DatabaseURL)
conf.DatabaseConfig.Name, } else {
conf.DatabaseConfig.Port)) switch confDBType {
case "mysql", "mssql": case "UNSET", "sqlite":
var host string // 未指定数据库或者明确指定为 sqlite 时,使用 SQLite 数据库
if conf.DatabaseConfig.UnixSocket { db, err = gorm.Open("sqlite3", util.RelativePath(conf.DatabaseConfig.DBFile))
host = fmt.Sprintf("unix(%s)", case "postgres":
conf.DatabaseConfig.Host) db, err = gorm.Open(confDBType, fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=disable",
} else {
host = fmt.Sprintf("(%s:%d)",
conf.DatabaseConfig.Host, conf.DatabaseConfig.Host,
conf.DatabaseConfig.Port) conf.DatabaseConfig.User,
conf.DatabaseConfig.Password,
conf.DatabaseConfig.Name,
conf.DatabaseConfig.Port))
case "mysql", "mssql":
var host string
if conf.DatabaseConfig.UnixSocket {
host = fmt.Sprintf("unix(%s)",
conf.DatabaseConfig.Host)
} else {
host = fmt.Sprintf("(%s:%d)",
conf.DatabaseConfig.Host,
conf.DatabaseConfig.Port)
}
db, err = gorm.Open(confDBType, fmt.Sprintf("%s:%s@%s/%s?charset=%s&parseTime=True&loc=Local",
conf.DatabaseConfig.User,
conf.DatabaseConfig.Password,
host,
conf.DatabaseConfig.Name,
conf.DatabaseConfig.Charset))
default:
return fmt.Errorf("unsupported database type %q", confDBType)
} }
db, err = gorm.Open(confDBType, fmt.Sprintf("%s:%s@%s/%s?charset=%s&parseTime=True&loc=Local",
conf.DatabaseConfig.User,
conf.DatabaseConfig.Password,
host,
conf.DatabaseConfig.Name,
conf.DatabaseConfig.Charset))
default:
return fmt.Errorf("unsupported database type %q", confDBType)
} }
//db.SetLogger(util.Log()) //db.SetLogger(util.Log())

Loading…
Cancel
Save