国产化适配迁移记录
国产化适配迁移记录
- 本项目基于RuoYi-Vue的框架进行迁移。
- 目前已完成覆盖测试暂无其他问题。
国产化环境
名称 | 版本 |
---|---|
达梦数据库 | DmJdbcDriver18 8.1.2.144 |
通用mapper – tk.mybatis | mapper-spring-boot-starter 4.2.5 |
<!-- 达梦数据库--><dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.2.141</version></dependency><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>4.2.2</version></dependency>
技术文档支持
达梦官网
达梦产品下载
达梦官方技术社区
达梦技术指南
Linux 安装
Windows 安装
Mysql数据迁移
已进行测试数据:基础平台开发库基础表
数据和结构部分无损迁移
使用DM数据迁移工具
--> 新建工程
--> 右键迁移目录节点
--> 新建迁移
涉及截图较多,随后再添加吧,挺简单的,遇到的问题都在下面写着呢
项目配置更改
数据源配置
#yml切换配置
#mysql
driverClassName: com.mysql.cj.jdbc.Driver
#达梦
driverClassName: dm.jdbc.driver.DmDriver
已知问题
- 解决 FIND_IN_SET函数问题
CREATE OR REPLACE
FUNCTION 模式名.FIND_IN_SET ( piv_str1 VARCHAR2,piv_str2 VARCHAR2,p_sep VARCHAR2 := ',')RETURN NUMBER
ISl_idx NUMBER:=0; -- 用于计算piv_str2中分隔符的位置str VARCHAR2(500); -- 根据分隔符截取的子字符串piv_str VARCHAR2(500) := piv_str2; -- 将piv_str2赋值给piv_strres NUMBER :=0; -- 返回结果loopIndex NUMBER :=0;
BEGIN-- 如果piv_str中没有分割符,直接判断piv_str1和piv_str是否相等,相等 res=1IF instr(piv_str, p_sep, 1) = 0 THENIF piv_str = piv_str1 THENres := 1;END IF;ELSE-- 循环按分隔符截取piv_strLOOPl_idx := instr(piv_str, p_sep);loopIndex:=loopIndex+1;-- 当piv_str中还有分隔符时IF l_idx > 0 THEN-- 截取第一个分隔符前的字段strstr:= SUBSTR(piv_str, 1, l_idx-1);-- 判断 str 和piv_str1 是否相等,相等 res=1 并结束循环判断IF str = piv_str1 THENres:= loopIndex;EXIT;END IF;piv_str := SUBSTR(piv_str, l_idx+LENGTH(p_sep));ELSE-- 当截取后的piv_str 中不存在分割符时,判断piv_str和piv_str1是否相等,相等 res=1IF piv_str = piv_str1 THENres:= loopIndex;END IF;-- 无论最后是否相等,都跳出循环EXIT;END IF;END LOOP;-- 结束循环END IF;-- 返回resRETURN res;
END FIND_IN_SET;
- 解决数据库模式名问题
#数据库模式名配置
mydb:myDatabaseSchemaName: scctest.
@Configuration
public class MyBatisConfig {/*** 数据库模式名*/@Value("${mydb.myDatabaseSchemaName}")private String myDatabaseSchemaName;/*** 数据库模式名key*/private final static String DATABASE_SCHEMA_NAME = "myDatabaseSchemaName";@Beanpublic SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();Properties pro = new Properties();pro.setProperty(DATABASE_SCHEMA_NAME, this.myDatabaseSchemaName);sessionFactory.setConfigurationProperties(pro);}
#sql写法
select * from ${myDatabaseSchemaName}sys_user
#实际效果
select * from scctest.sys_user
- 出现-2106: 第1 行附近出现错误:无效的表或视图名[xxxxx]
先检查是否存在该表或视图,如果存在,尝试增加模式名。使用时建议当前访问用户的用户名和数据库模式名保持一致,能减少迁移中的该问题出现频率。 - 不是 GROUP BY 表达式
所有通用关系型数据库标准语法都是这样的,SELECT子句中的列名必须为分组列或列函数,列函数对于GROUP BY子句定义的每个组各返回一个结果。对该语句oup.project_id,op.project_name字段均为分组列必须包含在GROUP BY中,如果不需要对project_name字段进行分组,那么需要在select中去掉该字段,如果又需要查询出project_name字段的值,可以考虑使用子查询的方式。
其他常见问题预检查
- 字符串转换异常 建议检查错误:- 传入数字类型,数据库为字符串 在系统运行时会出现该错误,在达梦控制台执行sql无异常;
- GROUP_CONCAT 替换函数 WM_CONCAT
- 禁止使用Mysql的 ` 分隔符来标记特殊字段
- 主键字段建议如下标记:
- @Id 标记id字段
- @KeySql(useGeneratedKeys = true) 标记插入时返回自增主键ID ,封包通用mapper时使用
- @Column(insertable = false) 插入时不传入主键(通用mapperch插入时默认是id =null,达梦数据库不支持),非自增可不添加该注解
- 数据库迁移时请优先在mysql数据库将datetime类型字段修改为timestamp,减少迁移过程中时间问题引发的异常错误
- 低版本tk.mybatis和dm驱动包可能引起更新时封包数据异常(表现为主键Id数值异常)达梦官网我提出的相关问题描述 建议使用文章开头列举的版本可以解决该问题
- SET IDENTITY_INSERT 表名 ON; 用这个sql来解决主键不允许修改,或者不允许指定主键值的问题。官方列举说可能是针对此次链接有效。目前个人测试是一直有效。暂时无法验证准确性
- sp_set_para_value(1,‘ENABLE_BLOB_CMP_FLAG’,1); 此sql来解决大字段排序问题。
- 查询时如果 字符串类型传入 int类型数据可能会引起异常