文章

pg数据库到达梦8迁移适配

pg数据库到达梦8迁移适配

pg数据库到达梦8迁移适配

策略

  • 数据库兼容性配置。使用DM提供的控制台工具,修改兼容性参数项COMPATIBLE_MODE,值设为7,设置为兼容pg数据库模式。其他参数按需修改。
  • 声明同义词。有功能相同的函数,可通过声明同义词的方式来替代。
  • 语义改写。使用相同语义的sql来替代,或者放在业务代码里实现。

适配方案

  • 动态修改。减少对原项目的侵入。利用数据库连接库提供的能力,例如使用阿里的Druid数据源,运行时拦截sql,并自定义改写,实现动态修改。
  • 静态修改。可以使用工具如mybatis-mapper2sql做自动化sql抽取和测试验证。

常见问题

group by别名

pg实现

在pg数据库中,group by字段支持别名和智能group by,若select段内的别名关联有表达式,会优先在group by之前执行。和一般数据库的sql执行顺序不同。

1
2
-- pg sql例。对别名ct字段执行GROUP BY之前,会先执行to_char函数
SELECT to_char(create_time , 'yyyy-MM-dd') AS ct FROM tb_xx GROUP BY ct;

适配达梦

需要显式的将别名关联的表达式作用在group by分组中。

1
2
-- dm sql改写例
SELECT to_char(create_time , 'yyyy-MM-dd') AS ct FROM tb_xx GROUP BY to_char(create_time , 'yyyy-MM-dd');

数据冲突处理

pg实现

在pg中,使用on conflict关键字做数据冲突处理,实现save or update的效果。

1
2
-- pg sql例
insert into tb_xx (name, value) values (?,?) on conflict(name) do update set value =?;

适配达梦

在达梦数据库中,没有该关键字,可以使用merge into + when then条件表达式做等价实现。

1
2
3
4
5
-- dm sql改写例
merge into tb_xx 
using dual on name = 'test' 
when matched then update set value = '22' 
when not matched then insert (name, value) values ('test', '11');
本文由作者按照 CC BY 4.0 进行授权