# dev_gorm-gbase-test **Repository Path**: GBase8s/dev_gorm-gbase-test ## Basic Information - **Project Name**: dev_gorm-gbase-test - **Description**: Golang GBase8s Gorm适配测试用例 - **Primary Language**: Go - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-25 - **Last Updated**: 2025-05-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Gorm Gbase Test Guide ## 介绍 GBase8s Dialector for GORM Test Suite ## 环境 Go 1.18 or higher GORM 1.25 or higher Gbase8s GCI驱动环境 ## 安装教程 1.前往Gbase[官网](https://www.gbase.cn/download/gbase-8s-1?category=DRIVER_PACKAGE)下载3.6.2及其以上版本的**Gbase8s GCI**驱动。 2.创建一个新目录,并在该目录下新建一个 **gbase8s.pc** 文件 文件 **gbase8s.pc** 的内容如下所示: ```bash prefix=/Users/Downloads/GCI/ includedir=${prefix}/include/ libdir=${prefix}/lib/ Name: gbase8s Description: gbase8s Instant Client Version: 8.8 Cflags: -I${includedir} Libs: -L${libdir} -lclntsh_gbase # 使用时将/Users/Downloads/GCI/替换成您自己的GCI所在目录 ``` 3.设置环境变量 ```bash export LD_LIBRARY_PATH=/Users/Downloads/GCI/lib:$LD_LIBRARY_PATH export PKG_CONFIG_PATH=/Users/Downloads/PC/ # 使用时将/Users/Downloads/GCI/和/Users/Downloads/PC/分别替换成您自己的GCI和gbase8s.pc所在目录 ``` ## 运行测试 1.下载代码 ```bash git clone git@gitee.com:GBase8s/dev_gorm-gbase-test.git ``` 2.切换带相应的目录 ```bash cd dev_gorm-gbase-test ``` 3.下载依赖 ```bash # 以下两个依赖库的版本和dev可自行调整 gitee.com/GBase8s/gorm-gbase v0.1.0 gitee.com/GBase8s/go-gci v0.1.0 # 执行依赖下载 go mod tidy ``` 4.执行测试 ```bash # 自行修改参数 tests_all.sh 的export GORM_DSN= 参数 export GORM_DSN="gbase8s://gbasedbt:gbasedbt123@172.16.33.29:9089/c11?GBASEDBTSERVER=gbaseserver&GCI_FACTORY=4&GOGCILogTrace=1&GormLogTrace=1&PROTOCOL=onsoctcp&delimident=1&sqlmode=oracle&DB_LOCALE=zh_CN.utf8&CLIENT_LOCALE=zh_CN.utf8" # 运行全部测试用例 bash tests_all.sh # 运行单个或多个测试,自行替换TestXxx go test -v -timeout 30s -run "^(TestJsonType|TestClobType)$" ``` ## 脚本全部用例输出结果(示例) **脚本输出结果** 1. 第一部分是gbase8s类型和dsn串的信息 2. 第二部分是具体执行的命令 - 在/tmp/tmp.xxx 文件中可以查看详细的执行数据 3. 第三部分是执行结果的统计信息(总用例数, 通过, 失败, 跳过的个数) 4. 第四部分是执行结果中失败或者跳过详情信息 5. 第五部分是执行结果中gbase8s跳过的不支持的详情信息 ```bash # bash tests_all.sh gbase8s gbase8s://gbasedbt:gbasedbt123@172.16.33.29:9089/c11?GBASEDBTSERVER=gbaseserver&GCI_FACTORY=4&GOGCILogTrace=1&GormLogTrace=1&PROTOCOL=onsoctcp&delimident=1&sqlmode=oracle&DB_LOCALE=zh_CN.utf8&CLIENT_LOCALE=zh_CN.utf8 go test -count=1 -v -race /root/code/gorm-source-code-tests > /tmp/tmp.2nGpmGP8DI 2>&1 === Test Statistics === Total Tests: 15112 Passed: 15088 Failed: 2 Skipped: 22 Failed Tests by File: query_test.go: - TestFindInBatchesWithOffsetLimit - TestOffset Skipped Tests by File: preload_suits_test.go: - TestManyToManyPreloadWithMultiPrimaryKeys callbacks_test.go: - TestConnPoolWrapper associations_many2many_test.go: - TestDuplicateMany2ManyAssociation migrate_test.go: - TestMigrateWithIndexComment Gbase8s Skipped Tests: upsert_test.go: - TestUpsert - [原因]:特性:merge into 语句正则匹配问题 update_many2many_test.go: - TestUpdateMany2ManyAssociations - [原因]:需gci支持:merge into 空格问题 ... ``` ## 单个或多个用例输出结果(示例) ```bash # go test -timeout 30s -v -run "^(TestOverrideJoinTable|TestClobType)$" -- result: 2025/01/01 09:09:09 testing gbase8s... === RUN TestClobType --- PASS: TestClobType (0.03s) === RUN TestOverrideJoinTable --- PASS: TestOverrideJoinTable (0.09s) PASS ok gorm-gbase/tests 0.408s ``` ## 其他 - TestConcurrentMany2ManyAssociation: 整体并发可能会存在并发问题 - serializer_test.go文件移除not null标签( `gorm:"serializer:json;not null"`) - 代码中搜索gbaseSkip,对应的方法为未实现或者不支持的特性 运行测试可看到相应结果: ```bash upsert_test.go: - TestUpsert - [原因]:特性:merge into 语句正则匹配问题 update_many2many_test.go: - TestUpdateMany2ManyAssociations - [原因]:需gci支持:merge into 空格问题 associations_test.go: - TestForeignKeyConstraints - [原因]:不支持:Constraint:OnUpdate:CASCADE 不支持update,支持delete - TestForeignKeyConstraintsBelongsTo - [原因]:不支持:Constraint:OnUpdate:CASCADE 不支持update,支持delete preload_suits_test.go: - TestManyToManyPreloadWithMultiPrimaryKeys - [原因]:限制:联合主键4个字段加起来赢超过8000;受约束的列的总长度太长 multi_primary_keys_test.go: - TestManyToManyWithMultiPrimaryKeys - [原因]:不支持:外键字段关联的表不是主键,只是部分主键 - TestManyToManyWithCustomizedForeignKeys - [原因]:不支持:外键字段关联的表不是主键,只是部分主键 - TestManyToManyWithCustomizedForeignKeys2 - [原因]:不支持:外键字段关联的表不是主键,只是部分主键 create_test.go: - TestCreateEmptyStruct - [原因]:不支持:INSERT INTO xxx DEFAULT VALUES; 表只有id字段 associations_many2many_test.go: - TestDuplicateMany2ManyAssociation - [原因]:需gci支持:merge into 空格问题 default_value_test.go: - TestDefaultValue - [原因]:不支持:语法notNull;default:'' query_test.go: - TestFindInBatchesWithOffsetLimit - [原因]:gci支持:offset取值问题 加上offset取值就为空 - TestSelect - [原因]:不支持:Select("COALESCE(age,?)", "42") 数据类型要要一致 - TestOffset - [原因]:gci支持:offset取值问题 加上offset取值就为空 count_test.go: - TestCount - [原因]:需gci支持:SELECT (CASE WHEN name='count-1' THEN 'main' ELSE 'other' END) as name 空格问题 update_test.go: - TestSave - [原因]:特性:save方法更新时,更新字段包含主键,不支持,例如可以omit(id)避免 ``` ## 帮助 如有问题请前往Gbase8s社区[官网](https://www.gbase.cn/community)寻求帮助。 --- 修改文件 1. TestSave::: 加上了omit(id) 2. TestSelect::: Select("COALESCE(age,?)", "42") 类型将字符串改成了int 3. TestUpsert::: merge into 语句 和 INSERT + UPDATE 模式语句正则不配,注释此行 4. TestDifferentTypeWithoutDeclaredLength::: text类型转换成clob类型