Files
go-admin/common/database/driver.go
T
zhangwenjian 2ec6cbdde8 fix🐛: tell a default build how to get the sqlite3 driver
A default build does not include sqlite3, and a config that names it stopped
with "unsupported database driver "sqlite3", this build supports mysql,
postgres, sqlserver". That says what is missing but not what to do about it.

For sqlite3 specifically, say to rebuild with -tags sqlite3. The test runs
only in a build without the tag, and fails without the hint.
2026-10-02 09:47:13 +08:00

41 lines
1.3 KiB
Go

package database
import (
"fmt"
"sort"
"strings"
"gorm.io/gorm"
)
// openerFor resolves the gorm dialector registered for driver.
//
// Which drivers exist depends on how the binary was built: sqlite3 needs cgo
// and is only compiled in under the sqlite3 build tag. A configuration naming a
// driver this build does not carry used to reach gorm.Open with a nil function,
// which is a nil dereference deep in the stack rather than an answer.
func openerFor(driver string) (func(string) gorm.Dialector, error) {
open, ok := opens[driver]
if !ok {
// sqlite3 is the driver people reach for first, and the one a default
// build leaves out. Say how to get it rather than only what is missing.
if driver == "sqlite3" {
return nil, fmt.Errorf("database driver %q is not in this build, rebuild with -tags sqlite3 (this build supports %s)",
driver, strings.Join(supportedDrivers(), ", "))
}
return nil, fmt.Errorf("unsupported database driver %q, this build supports %s",
driver, strings.Join(supportedDrivers(), ", "))
}
return open, nil
}
// supportedDrivers lists what this build can open, in a stable order.
func supportedDrivers() []string {
names := make([]string, 0, len(opens))
for name := range opens {
names = append(names, name)
}
sort.Strings(names)
return names
}