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:
2026-08-08 10:36:57 +08:00
parent 1f6c8a18a3
commit 9154afab6b
35 changed files with 4956 additions and 37 deletions
+62
View File
@@ -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)
}
}