chore(build): 新增 make test/lint/fmt 并修复 testdb 连接串缺陷

- make test 自动拉起并等待 PostgreSQL 就绪;测试用临时 schema 隔离,不污染开发库
- 新增 make test-db / lint / fmt
- 修复 testdb.withSearchPath:原实现用 url.Values.Encode() 重编码整个查询串,
  把 TimeZone=Asia/Shanghai 变成 Asia%2FShanghai,pgx 原样传给服务端后报
  "unknown time zone Asia%2FShanghai",导致数据库起来后集成测试依然全挂。
  改为只追加 search_path,并补测试锁定该行为。
This commit is contained in:
yml2213
2026-10-06 19:42:49 +08:00
parent d821fe13df
commit d423fc652c
3 changed files with 91 additions and 4 deletions
+11 -3
View File
@@ -61,12 +61,20 @@ func New(t testing.TB, _ ...interface{}) *gorm.DB {
return db
}
// withSearchPath 给 DSN 追加 search_path,让每个测试用例落在自己的临时 schema 里。
//
// 注意:这里刻意只「追加」而不用 url.Values.Encode() 重新编码整个查询串。
// 重新编码会把 TimeZone=Asia/Shanghai 变成 Asia%2FShanghai,pgx 会把这个值原样
// 传给服务端并报错 "unknown time zone Asia%2FShanghai",导致所有集成测试连不上库。
func withSearchPath(dsn, schema string) string {
parsed, err := url.Parse(dsn)
if err == nil && strings.HasPrefix(parsed.Scheme, "postgres") {
query := parsed.Query()
query.Set("search_path", schema)
parsed.RawQuery = query.Encode()
separator := "&"
if parsed.RawQuery == "" {
separator = "?"
}
// url.URL.String() 原样输出 RawQuery,不会再做一次百分号编码。
parsed.RawQuery = parsed.RawQuery + separator + "search_path=" + url.QueryEscape(schema)
return parsed.String()
}
if strings.TrimSpace(dsn) == "" {