feat: Oracle 驱动完整化——回调体系、版本感知、驱动抽象层与测试套件
- 新增驱动抽象层 driver_adapter(go-ora/godror 双驱动切换) - 新增 Update/Delete/Query 回调,完善 RETURNING INTO 子句 - 修复 create.go 事务悬挂行 BUG、批量 RowsAffected、主键 WHERE 注入 - 版本感知体系:分页/自增/序列默认值/BOOLEAN/32k VARCHAR2 分级能力判定 - 11g 序列+触发器自增、ON UPDATE 触发器、默认值智能转换 - 升级 go-ora v2.8.19 → v2.9.0 - 单元测试+模块测试+集成测试共 96 个,真实 Oracle 11g 全绿 - 测试 DSN 密码移除,改为 ORACLE_DSN 环境变量注入
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
package tests
|
||||
|
||||
import (
|
||||
"log"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"gorm.io/gorm"
|
||||
|
||||
oracle "git.charlienet.top/go/oracle"
|
||||
)
|
||||
|
||||
var DB *gorm.DB
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
// 使用提供的 DSN(可通过 ORACLE_DSN 环境变量覆盖)
|
||||
dsn := os.Getenv("ORACLE_DSN")
|
||||
if dsn == "" {
|
||||
// 注:go-ora v2.9.0 起 CONNECTION TIMEOUT 语义从"socket 读超时"变为"连接建立超时";
|
||||
// 读超时改用 SOCKET TIMEOUT 指定。两者均设 90s 以保留原有的读超时保护语义。
|
||||
// 安全:此处为占位符,真实 DSN 请通过 ORACLE_DSN 环境变量提供,避免凭据入库。
|
||||
dsn = "oracle://user:password@host:1521/service?SSL=false&CONNECTION TIMEOUT=90&SOCKET TIMEOUT=90&LANGUAGE=SIMPLIFIED+CHINESE&TERRITORY=CHINA"
|
||||
}
|
||||
|
||||
var err error
|
||||
DB, err = gorm.Open(oracle.Open(dsn), &gorm.Config{})
|
||||
if err != nil {
|
||||
log.Fatalf("failed to connect database: %v", err)
|
||||
}
|
||||
log.Println("successfully connected to database")
|
||||
|
||||
// 清理测试表
|
||||
cleanup()
|
||||
|
||||
// 运行测试
|
||||
code := m.Run()
|
||||
|
||||
// 最终清理
|
||||
cleanup()
|
||||
|
||||
os.Exit(code)
|
||||
}
|
||||
|
||||
// cleanup 删除所有测试表(忽略错误,因为表可能不存在)
|
||||
func cleanup() {
|
||||
_ = DB.Migrator().DropTable(&User{}, &Product{}, &Order{}, &UserWithHook{}, &SeqDefaultViaDriverModel{}, &BigStringModel{})
|
||||
// TEST_SEQ_DEFAULT 表通过原生 SQL 创建(无 autoIncrement),DropTable 无法识别,
|
||||
// 因此用原生 SQL 清理表与序列
|
||||
DB.Exec("DROP TABLE TEST_SEQ_DEFAULT")
|
||||
DB.Exec("DROP SEQUENCE SEQ_TEST_SEQ_DEFAULT")
|
||||
// 序列默认值测试的独立序列(TEST_SEQ_DEF 表可通过 DropTable 清理并级联删除触发器)
|
||||
DB.Exec("DROP SEQUENCE SEQ_TEST_SEQ_DEF_CODE")
|
||||
DB.Exec("DROP SEQUENCE SEQ_TEST_SEQ_DEF")
|
||||
}
|
||||
|
||||
// clearTable 清空指定测试表,保证测试之间的数据隔离
|
||||
func clearTable(t *testing.T, table string) {
|
||||
t.Helper()
|
||||
if err := DB.Exec("DELETE FROM " + table).Error; err != nil {
|
||||
t.Fatalf("failed to clear table %s: %v", table, err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user