This commit is contained in:
parent
99b98c88fd
commit
2248190535
@ -35,12 +35,8 @@ func Init(version string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch cfg.DbType {
|
switch cfg.DbType {
|
||||||
case "mysql":
|
case "mysql", "sqlite", "postgres":
|
||||||
Instance, err = xorm.NewEngine("mysql", dsn)
|
Instance, err = newDatabaseEngine(cfg.DbType, dsn)
|
||||||
case "sqlite":
|
|
||||||
Instance, err = xorm.NewEngine("sqlite", dsn)
|
|
||||||
case "postgres":
|
|
||||||
Instance, err = xorm.NewEngine("postgres", dsn)
|
|
||||||
default:
|
default:
|
||||||
return errors.New("Database Type Error!")
|
return errors.New("Database Type Error!")
|
||||||
}
|
}
|
||||||
@ -110,6 +106,17 @@ func Init(version string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newDatabaseEngine(driver, dsn string) (*xorm.Engine, error) {
|
||||||
|
engine, err := xorm.NewEngine(driver, dsn)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
// 数据库存储与跨库迁移统一使用 UTC,读取后仍按应用时区展示。
|
||||||
|
// 不得把驱动返回的 UTC 时间按本地时区重新解释。
|
||||||
|
engine.SetTZDatabase(time.UTC)
|
||||||
|
return engine, nil
|
||||||
|
}
|
||||||
|
|
||||||
func WithContext(ctx *requestcontext.Context, sql string) string {
|
func WithContext(ctx *requestcontext.Context, sql string) string {
|
||||||
if ctx != nil {
|
if ctx != nil {
|
||||||
logId := ctx.GetValue(requestcontext.LogID)
|
logId := ctx.GetValue(requestcontext.LogID)
|
||||||
|
|||||||
@ -4,11 +4,55 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"git.pcux.cn/xuans/Smail/config"
|
"git.pcux.cn/xuans/Smail/config"
|
||||||
"git.pcux.cn/xuans/Smail/db/migration"
|
"git.pcux.cn/xuans/Smail/db/migration"
|
||||||
|
"xorm.io/xorm/convert"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestDatabaseEnginePreservesMigratedUTCTime(t *testing.T) {
|
||||||
|
previousLocal := time.Local
|
||||||
|
time.Local = time.FixedZone("CST", 8*3600)
|
||||||
|
t.Cleanup(func() { time.Local = previousLocal })
|
||||||
|
|
||||||
|
for _, tc := range []struct {
|
||||||
|
driver string
|
||||||
|
dsn string
|
||||||
|
}{
|
||||||
|
{"sqlite", ":memory:"},
|
||||||
|
{"mysql", "smail@tcp(127.0.0.1:3306)/smail?parseTime=true"},
|
||||||
|
{"postgres", "host=127.0.0.1 user=smail dbname=smail sslmode=require"},
|
||||||
|
} {
|
||||||
|
t.Run(tc.driver, func(t *testing.T) {
|
||||||
|
engine, err := newDatabaseEngine(tc.driver, tc.dsn)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
t.Cleanup(func() { _ = engine.Close() })
|
||||||
|
if engine.GetTZDatabase() != time.UTC {
|
||||||
|
t.Fatalf("database timezone = %v, want UTC", engine.GetTZDatabase())
|
||||||
|
}
|
||||||
|
if engine.GetTZLocation() != time.Local {
|
||||||
|
t.Fatalf("display timezone = %v, want CST", engine.GetTZLocation())
|
||||||
|
}
|
||||||
|
want := time.Date(2026, 10, 3, 16, 56, 0, 0, time.UTC)
|
||||||
|
for _, value := range []any{want, "2026-10-03 16:56:00"} {
|
||||||
|
got, err := convert.AsTime(value, engine.GetTZDatabase(), engine.GetTZLocation())
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if got == nil || !got.Equal(want) {
|
||||||
|
t.Fatalf("converted time = %v, want instant %v", got, want)
|
||||||
|
}
|
||||||
|
if display := got.Format("2006-01-02 15:04:05"); display != "2026-10-04 00:56:00" {
|
||||||
|
t.Fatalf("display time = %s, want 2026-10-04 00:56:00", display)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestInitAppliesSchemaMigration(t *testing.T) {
|
func TestInitAppliesSchemaMigration(t *testing.T) {
|
||||||
databasePath := filepath.Join(t.TempDir(), "init.db")
|
databasePath := filepath.Join(t.TempDir(), "init.db")
|
||||||
previousConfig := config.Instance
|
previousConfig := config.Instance
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user