diff --git a/dice/model/database/sqlite.go b/dice/model/database/sqlite.go index 2a196913..c5403578 100644 --- a/dice/model/database/sqlite.go +++ b/dice/model/database/sqlite.go @@ -4,35 +4,162 @@ package database import ( - "github.com/glebarez/sqlite" + "database/sql" + "fmt" + "runtime" + + _ "github.com/ncruces/go-sqlite3/embed" + sqlite "github.com/ncruces/go-sqlite3/gormlite" + "gorm.io/gorm" "gorm.io/gorm/logger" "sealdice-core/dice/model/database/cache" ) +// 警告:不要在一个事务(写事务)里使用读的DB!否则读的DB会发现有人在写而锁住,从而死锁。 + func SQLiteDBInit(path string, useWAL bool) (*gorm.DB, error) { - db, err := gorm.Open(sqlite.Open(path), &gorm.Config{ + // 使用即时事务 + path = fmt.Sprintf("file:%v?_txlock=immediate&_busy_timeout=15000", path) + open, err := gorm.Open(sqlite.Open(path), &gorm.Config{ // 注意,这里虽然是Info,但实际上打印就变成了Debug. Logger: logger.Default.LogMode(logger.Info), }) - // https://github.com/glebarez/sqlite/issues/52 尚未遇见问题,可以先考虑不使用 - // sqlDB, _ := db.DB() - // sqlDB.SetMaxOpenConns(1) if err != nil { return nil, err } // Enable Cache Mode - db, err = cache.GetOtterCacheDB(db) + open, err = cache.GetOtterCacheDB(open) if err != nil { return nil, err } - // enable WAL mode if useWAL { - err = db.Exec("PRAGMA journal_mode=WAL").Error + err = open.Exec("PRAGMA journal_mode=WAL").Error if err != nil { - return nil, err + panic(err) } } - return db, err + return open, err +} + +func createReadDB(path string, gormConf *gorm.Config) (*gorm.DB, error) { + // _txlock=immediate 解决BEGIN IMMEDIATELY + path = fmt.Sprintf("file:%v?_txlock=immediate", path) + // ---- 创建读连接 ----- + readDB, err := gorm.Open(sqlite.Open(path), gormConf) + if err != nil { + return nil, err + } + readPool, err := readDB.DB() + if err != nil { + return nil, err + } + err = SetDefaultPragmas(readPool) + if err != nil { + return nil, err + } + readPool.SetMaxOpenConns(max(4, runtime.NumCPU())) + return readDB, nil +} + +func createWriteDB(path string, gormConf *gorm.Config) (*gorm.DB, error) { + // 注意基于wasm的版本必须添加file: + path = fmt.Sprintf("file:%v?_txlock=immediate", path) + // ---- 创建写连接 ----- + writeDB, err := gorm.Open(sqlite.Open(path), gormConf) + if err != nil { + return nil, err + } + writePool, err := writeDB.DB() + if err != nil { + return nil, err + } + err = SetDefaultPragmas(writePool) + if err != nil { + return nil, err + } + writePool.SetMaxOpenConns(1) // only use one active connection for writing + return writeDB, nil +} + +func SQLiteDBRWInit(path string) (*gorm.DB, *gorm.DB, error) { + // 由于现在我们只有一个写入连接,所以不需要使用事务 + gormConf := &gorm.Config{ + Logger: logger.Default.LogMode(logger.Info), + SkipDefaultTransaction: true, + } + readDB, err := createReadDB(path, gormConf) + if err != nil { + return nil, nil, err + } + writeDB, err := createWriteDB(path, gormConf) + if err != nil { + return nil, nil, err + } + // ----- 启用共享缓存插件 ----- + plugin, err := cache.GetOtterCacheDBPluginInstance() + if err != nil { + return nil, nil, err + } + err = readDB.Use(plugin) + if err != nil { + return nil, nil, err + } + err = writeDB.Use(plugin) + if err != nil { + return nil, nil, err + } + return readDB, writeDB, nil +} + +// SetDefaultPragmas defines some sqlite pragmas for good performance and litestream compatibility +// https://highperformancesqlite.com/articles/sqlite-recommended-pragmas +// https://litestream.io/tips/ +// copied from https://github.com/bihe/monorepo +// add PRAGMA optimize=0x10002; from https://github.com/Palats/mastopoof +func SetDefaultPragmas(db *sql.DB) error { + var ( + stmt string + val string + ) + // 外键的暂时弃用,反正咱也不用外键536870912 + // "foreign_keys": "1", // 1(bool) --> https://www.sqlite.org/pragma.html#pragma_foreign_keys + defaultPragmas := map[string]string{ + "journal_mode": "wal", // https://www.sqlite.org/pragma.html#pragma_journal_mode + "busy_timeout": "15000", // https://www.sqlite.org/pragma.html#pragma_busy_timeout + // 在 WAL 模式下使用 synchronous=NORMAL 提交的事务可能会在断电或系统崩溃后回滚。 + // 无论同步设置或日志模式如何,事务在应用程序崩溃时都是持久的。 + // 对于在 WAL 模式下运行的大多数应用程序来说,synchronous=NORMAL 设置是一个不错的选择。 + "synchronous": "1", // NORMAL --> https://www.sqlite.org/pragma.html#pragma_synchronous + "cache_size": "536870912", // 536870912 = 512MB --> https://www.sqlite.org/pragma.html#pragma_cache_size + } + + // set the pragmas + for k := range defaultPragmas { + stmt = fmt.Sprintf("pragma %s = %s", k, defaultPragmas[k]) + if _, err := db.Exec(stmt); err != nil { + return err + } + } + + // validate the pragmas + for k := range defaultPragmas { + row := db.QueryRow(fmt.Sprintf("pragma %s", k)) + err := row.Scan(&val) + if err != nil { + return err + } + if val != defaultPragmas[k] { + return fmt.Errorf("could not set pragma %s to %s", k, defaultPragmas[k]) + } + } + // 这个不能在上面,因为他没有任何返回值 + // Setup some regular optimization according to sqlite doc: + // https://www.sqlite.org/lang_analyze.html + if _, err := db.Exec("PRAGMA optimize=0x10002;"); err != nil { + return fmt.Errorf("unable set optimize pragma: %w", err) + } + + return nil } diff --git a/dice/model/database/sqlite_cgo.go b/dice/model/database/sqlite_cgo.go index abc87d12..2822f583 100644 --- a/dice/model/database/sqlite_cgo.go +++ b/dice/model/database/sqlite_cgo.go @@ -19,7 +19,7 @@ import ( func SQLiteDBInit(path string, useWAL bool) (*gorm.DB, error) { // 使用即时事务 - path = fmt.Sprintf("%v?_txlock=immediate&_busy_timeout=15000", path) + path = fmt.Sprintf("file:%v?_txlock=immediate&_busy_timeout=15000", path) open, err := gorm.Open(sqlite.Open(path), &gorm.Config{ // 注意,这里虽然是Info,但实际上打印就变成了Debug. Logger: logger.Default.LogMode(logger.Info), @@ -43,7 +43,7 @@ func SQLiteDBInit(path string, useWAL bool) (*gorm.DB, error) { func createReadDB(path string, gormConf *gorm.Config) (*gorm.DB, error) { // _txlock=immediate 解决BEGIN IMMEDIATELY - path = fmt.Sprintf("%v?_txlock=immediate", path) + path = fmt.Sprintf("file:%v?_txlock=immediate", path) // ---- 创建读连接 ----- readDB, err := gorm.Open(sqlite.Open(path), gormConf) if err != nil { @@ -63,6 +63,7 @@ func createReadDB(path string, gormConf *gorm.Config) (*gorm.DB, error) { func createWriteDB(path string, gormConf *gorm.Config) (*gorm.DB, error) { // ---- 创建写连接 ----- + path = fmt.Sprintf("file:%v?_txlock=immediate", path) writeDB, err := gorm.Open(sqlite.Open(path), gormConf) if err != nil { return nil, err diff --git a/go.mod b/go.mod index 0915c7c7..797381b4 100644 --- a/go.mod +++ b/go.mod @@ -22,8 +22,6 @@ require ( github.com/fy0/systray v1.2.2 github.com/fyrchik/go-shlex v0.0.0-20210215145004-cd7f49bfd959 github.com/gen2brain/beeep v0.0.0-20230907135156-1a38885a97fc - github.com/glebarez/go-sqlite v1.22.0 - github.com/glebarez/sqlite v1.11.0 github.com/go-creed/sat v1.0.3 github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 github.com/golang-module/carbon v1.7.3 @@ -67,9 +65,9 @@ require ( github.com/yuin/goldmark v1.7.4 go.etcd.io/bbolt v1.3.11 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.29.0 + golang.org/x/crypto v0.32.0 golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 - golang.org/x/sys v0.27.0 + golang.org/x/sys v0.29.0 golang.org/x/text v0.21.0 golang.org/x/time v0.5.0 gopkg.in/elazarl/goproxy.v1 v1.0.0-20180725130230-947c36da3153 @@ -81,11 +79,11 @@ require ( require ( github.com/blevesearch/bleve_index_api v1.1.13 + github.com/glebarez/sqlite v1.11.0 github.com/go-gorm/caches/v4 v4.0.5 github.com/gofrs/flock v0.12.1 - github.com/gonutz/w32/v2 v2.11.1 github.com/joho/godotenv v1.5.1 - github.com/spaolacci/murmur3 v1.1.0 + github.com/maypok86/otter v1.2.4 github.com/tidwall/gjson v1.17.0 github.com/tidwall/sjson v1.2.5 gorm.io/driver/mysql v1.5.7 @@ -128,6 +126,7 @@ require ( github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7 // indirect github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55 // indirect github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f // indirect + github.com/glebarez/go-sqlite v1.21.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-resty/resty/v2 v2.11.0 // indirect github.com/go-sourcemap/sourcemap v2.1.4+incompatible // indirect @@ -157,12 +156,14 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect - github.com/maypok86/otter v1.2.4 // indirect github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/mschoch/smat v0.2.0 // indirect + github.com/ncruces/go-sqlite3 v0.22.0 // indirect + github.com/ncruces/go-sqlite3/gormlite v0.22.0 // indirect + github.com/ncruces/julianday v1.0.0 // indirect github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d // indirect github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect github.com/pdfcpu/pdfcpu v0.8.1 // indirect @@ -177,6 +178,7 @@ require ( github.com/sunshineplan/tiff v0.0.0-20220128141034-29b9d69bd906 // indirect github.com/tadvi/systray v0.0.0-20190226123456-11a2b8fa57af // indirect github.com/tdewolff/parse/v2 v2.7.15 // indirect + github.com/tetratelabs/wazero v1.8.2 // indirect github.com/tidwall/btree v1.7.0 // indirect github.com/tidwall/grect v0.1.4 // indirect github.com/tidwall/match v1.1.1 // indirect @@ -192,17 +194,16 @@ require ( golang.org/x/mod v0.18.0 // indirect golang.org/x/net v0.31.0 // indirect golang.org/x/sync v0.10.0 // indirect - golang.org/x/term v0.26.0 // indirect + golang.org/x/term v0.28.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gorm.io/plugin/dbresolver v1.5.3 // indirect - modernc.org/libc v1.37.6 // indirect - modernc.org/mathutil v1.6.0 // indirect - modernc.org/memory v1.7.2 // indirect - modernc.org/sqlite v1.28.0 // indirect + modernc.org/libc v1.22.5 // indirect + modernc.org/mathutil v1.5.0 // indirect + modernc.org/memory v1.5.0 // indirect + modernc.org/sqlite v1.23.1 // indirect ) replace ( diff --git a/go.sum b/go.sum index 2be39d5e..64a2c153 100644 --- a/go.sum +++ b/go.sum @@ -132,8 +132,8 @@ github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55 h1:XYzSdCbkzOC0F github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55/go.mod h1:6mmzY2kW1TOOrVy+r41Za2MxXM+hhqTtY3oBKd2AgFA= github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f h1:wrYrQttPS8FHIRSlsrcuKazukx/xqO/PpLZzZXsF+EA= github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA= -github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ= -github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc= +github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9gAXWo= +github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k= github.com/go-creed/sat v1.0.3 h1:V1IkiYYFDPKXaRhdg95oAh5IHZ3Qhs5AEVlhteM+6XA= github.com/go-creed/sat v1.0.3/go.mod h1:ZxAhQ0ikMzjqeMbFeoMdCr6es8p10Y87F2nHkqNjSbY= github.com/go-gorm/caches/v4 v4.0.5 h1:Sdj9vxbEM0sCmv5+s5o6GzoVMuraWF0bjJJvUU+7c1U= @@ -190,8 +190,6 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gonutz/w32/v2 v2.11.1 h1:plG738ZY7VIkPGf3adZ6lFeAf2evCKrULKyZT5GrPoc= -github.com/gonutz/w32/v2 v2.11.1/go.mod h1:MgtHx0AScDVNKyB+kjyPder4xIi3XAcHS6LDDU2DmdE= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -308,6 +306,12 @@ github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM= github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw= github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM= github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= +github.com/ncruces/go-sqlite3 v0.22.0 h1:FkGSBhd0TY6e66k1LVhyEpA+RnG/8QkQNed5pjIk4cs= +github.com/ncruces/go-sqlite3 v0.22.0/go.mod h1:ueXOZXYZS2OFQirCU3mHneDwJm5fGKHrtccYBeGEV7M= +github.com/ncruces/go-sqlite3/gormlite v0.22.0 h1:1kn6lXjiBe+5up9KJ24dqGixbr+L6sQFrXc4ay9IMqg= +github.com/ncruces/go-sqlite3/gormlite v0.22.0/go.mod h1:R0/mKQ7ahIY32z4ZlCVuwvSjlPbN9PN3b9NxyE3AzFQ= +github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M= +github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= @@ -340,6 +344,7 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= @@ -420,6 +425,8 @@ github.com/tdewolff/parse/v2 v2.7.15/go.mod h1:3FbJWZp3XT9OWVN3Hmfp0p/a08v4h8J9W github.com/tdewolff/test v1.0.11-0.20231101010635-f1265d231d52/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739 h1:IkjBCtQOOjIn03u/dMQK9g+Iw9ewps4mCl1nB8Sscbo= github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8= +github.com/tetratelabs/wazero v1.8.2 h1:yIgLR/b2bN31bjxwXHD8a3d+BogigR952csSDdLYEv4= +github.com/tetratelabs/wazero v1.8.2/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= github.com/tidwall/assert v0.1.0 h1:aWcKyRBUAdLoVebxo95N7+YZVTFF/ASTr7BN4sLP6XI= github.com/tidwall/assert v0.1.0/go.mod h1:QLYtGyeqse53vuELQheYl9dngGCJQ+mTtlxcktb+Kj8= github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= @@ -487,8 +494,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= -golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= +golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 h1:LoYXNGAShUG3m/ehNk4iFctuhGX/+R1ZpfJ4/ia80JM= golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -524,8 +531,6 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= -golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -558,16 +563,16 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= -golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU= -golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= +golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= +golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -576,9 +581,6 @@ golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= -golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -644,15 +646,13 @@ gorm.io/driver/sqlite v1.5.7-0.20240930031831-02b8e0623276/go.mod h1:U+J8craQU6F gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= -gorm.io/plugin/dbresolver v1.5.3 h1:wFwINGZZmttuu9h7XpvbDHd8Lf9bb8GNzp/NpAMV2wU= -gorm.io/plugin/dbresolver v1.5.3/go.mod h1:TSrVhaUg2DZAWP3PrHlDlITEJmNOkL0tFTjvTEsQ4XE= -modernc.org/libc v1.37.6 h1:orZH3c5wmhIQFTXF+Nt+eeauyd+ZIt2BX6ARe+kD+aw= -modernc.org/libc v1.37.6/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= -modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= -modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= -modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= -modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= -modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= -modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= +modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE= +modernc.org/libc v1.22.5/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= +modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/sqlite v1.23.1 h1:nrSBg4aRQQwq59JpvGEQ15tNxoO5pX/kUjcRNwSAGQM= +modernc.org/sqlite v1.23.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk= moul.io/zapfilter v1.7.0 h1:7aFrG4N72bDH9a2BtYUuUaDS981Dxu3qybWfeqaeBDU= moul.io/zapfilter v1.7.0/go.mod h1:M+N2s+qZiA+bzRoyKMVRxyuERijS2ovi2pnMyiOGMvc= diff --git a/migrate/db_util.go b/migrate/db_util.go index 9ed44029..090bdf32 100644 --- a/migrate/db_util.go +++ b/migrate/db_util.go @@ -4,9 +4,11 @@ package migrate import ( - _ "github.com/glebarez/go-sqlite" - "github.com/glebarez/sqlite" + "fmt" + "github.com/jmoiron/sqlx" + _ "github.com/ncruces/go-sqlite3/embed" + sqlite "github.com/ncruces/go-sqlite3/gormlite" "gorm.io/gorm" "gorm.io/gorm/logger" @@ -14,6 +16,7 @@ import ( ) func openDB(path string) (*sqlx.DB, error) { + path = fmt.Sprintf("file:%v?_txlock=immediate&_busy_timeout=15000", path) gdb, err := gorm.Open(sqlite.Open(path), &gorm.Config{ // 注意,这里虽然是Info,但实际上打印就变成了Debug. Logger: logger.Default.LogMode(logger.Info),