Files
go-admin/common/database/initialize.go
T
zhangwenjian ea679bf00b fix🐛: give sqlite connections a busy timeout, WAL and immediate transactions
A file-backed sqlite database ran in rollback-journal mode with no busy
timeout, so concurrent requests failed with "database is locked" instead of
waiting for each other. Add the defaults to the sqlite3 connection string
unless the configured source already sets them.
2026-10-07 17:32:39 +08:00

76 lines
2.2 KiB
Go

package database
import (
"time"
mycasbin "github.com/go-admin-team/go-admin-core/v2/casbin"
log "github.com/go-admin-team/go-admin-core/v2/logger"
"github.com/go-admin-team/go-admin-core/v2/sdk"
toolsConfig "github.com/go-admin-team/go-admin-core/v2/sdk/config"
"github.com/go-admin-team/go-admin-core/v2/sdk/pkg"
toolsDB "github.com/go-admin-team/go-admin-core/v2/tools/database"
. "github.com/go-admin-team/go-admin-core/v2/tools/gorm/gormlog"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
"go-admin/common/global"
)
// Setup 配置数据库
func Setup() {
for k := range toolsConfig.DatabasesConfig {
setupSimpleDatabase(k, toolsConfig.DatabasesConfig[k])
}
}
func setupSimpleDatabase(host string, c *toolsConfig.Database) {
if global.Driver == "" {
global.Driver = c.Driver
}
log.Infof("%s => %s", host, pkg.Green(redactDSN(c.Source)))
registers := make([]toolsDB.ResolverConfigure, len(c.Registers))
for i := range c.Registers {
registers[i] = toolsDB.NewResolverConfigure(
c.Registers[i].Sources,
c.Registers[i].Replicas,
c.Registers[i].Policy,
c.Registers[i].Tables)
}
open, err := openerFor(c.Driver)
if err != nil {
log.Fatal(pkg.Red(err.Error()))
}
open = withSqliteDefaults(c.Driver, open)
resolverConfig := toolsDB.NewConfigure(c.Source, c.MaxIdleConns, c.MaxOpenConns, c.ConnMaxIdleTime, c.ConnMaxLifeTime, registers)
db, err := resolverConfig.Init(&gorm.Config{
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
Logger: New(
logger.Config{
SlowThreshold: time.Second,
Colorful: true,
LogLevel: logger.LogLevel(
log.DefaultLogger.Options().Level.LevelForGorm()),
},
),
}, open)
if err != nil {
log.Fatal(pkg.Red(c.Driver+" connect error :"), err)
} else {
log.Info(pkg.Green(c.Driver + " connect success !"))
}
// Keyed by host, matching the database this enforcer reads from. Passing
// the same key for every host would hand each one the enforcer built from
// whichever database was configured first, and the rest would be decided
// by a casbin_rule table that is not theirs.
e := mycasbin.Setup(db, host)
sdk.Runtime.SetDbByTenant(host, db)
sdk.Runtime.SetCasbinByTenant(host, e)
}