Files
charlie 9154afab6b 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 环境变量注入
2026-08-08 10:36:57 +08:00

59 lines
1.9 KiB
Go

package clauses
import (
"strconv"
"testing"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
)
// testDialector 是仅用于 SQL 生成测试的最小 Dialector 实现,无需数据库连接。
// 它模拟 Oracle 的绑定变量占位符(:N)和不加引号的标识符引用。
type testDialector struct{}
func (testDialector) Name() string { return "oracle" }
func (testDialector) Initialize(*gorm.DB) error { return nil }
func (testDialector) Migrator(*gorm.DB) gorm.Migrator { return nil }
func (testDialector) DataTypeOf(*schema.Field) string { return "" }
func (testDialector) DefaultValueOf(*schema.Field) clause.Expression { return nil }
func (testDialector) BindVarTo(writer clause.Writer, stmt *gorm.Statement, v interface{}) {
writer.WriteString(":")
writer.WriteString(strconv.Itoa(len(stmt.Vars)))
}
func (testDialector) QuoteTo(writer clause.Writer, str string) {
writer.WriteString(str)
}
func (testDialector) Explain(sql string, vars ...interface{}) string { return sql }
// newStatement 构造一个可以直接作为 clause.Builder 使用的 gorm.Statement。
func newStatement(t *testing.T) *gorm.Statement {
t.Helper()
db := &gorm.DB{
Config: &gorm.Config{Dialector: testDialector{}},
}
return &gorm.Statement{DB: db, Table: "users"}
}
// buildSQL 直接调用子句的 Build 方法生成 SQL。
func buildSQL(t *testing.T, expr clause.Expression) string {
t.Helper()
stmt := newStatement(t)
expr.Build(stmt)
return stmt.SQL.String()
}
// buildClauseSQL 通过 clause.Clause(模拟 gorm.Statement.Build 的构建流程)
// 生成带子句名前缀的完整 SQL。
func buildClauseSQL(t *testing.T, name string, expr clause.Expression) string {
t.Helper()
stmt := newStatement(t)
cc := clause.Clause{Name: name, Expression: expr}
cc.Build(stmt)
return stmt.SQL.String()
}