数据库从Mysql切换到Postgresql常见问题(配置参数和代码修改)RuoYi项目为例

数据库从Mysql切换到Postgresql常见问题(在前后端代码修改),包括基本参数配置和mapper.xml等在内使用到sql语法修改

1.配置参数修改

1.1添加依赖
找到项目的总pom.xml文件,修改依赖,注释掉mysql的依赖,替换成postgresql的依赖。

<!-- postgre Connector -->
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>

1.2修改yml参数
在子模块的src下的resources中找到application.yml文件,看spring的参数环境是prod还是dev,再去对应的yml中修改数据源配置datasource,一般有主数据源和从数据源(需要才使用),修改主数据源为Postgresql的即可。

注意yml文件的一些常见规范:
A. yml文件对于代码的缩进和对齐有很严格的要求,缩进代表层级关系,不可以使用**“tab”**键来缩进,缩进要使用 空格 来缩进,不要求空格数,只需要相同层级左对齐
B. 冒号“:”数据格式key:value,冒号后要有一个空格
C. “-” 后面要有一个空格
D. "#"表示注释内容

# pg主库数据源
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://本地或者远程连接数据库/数据库名?characterEncodeing=utf8&TimeZone=Asia/Shanghai&stringtype=unspecified
    username: postgres
    password: 你设置的密码

characterEncodeing=utf8&TimeZone=Asia/Shanghai&stringtype=unspecified 这是较为基本和常用的数据库连接参数设置,有其他需要的自己添加即可。
在该yml中如果还有用到mysql相关的也要进行替换,比如pagehelper分页插件可能会使用,不过pagehelper分页更多出现在依赖中。

2.Mapper修改sql语句

打开【全局替换】快捷键crtl+shift+r,在mapper的文件夹目录下做全局替换比较稳妥,
RuoYi项目为例
替换Mapper中 status = 0 为 status = ‘0’
替换Mapper中sysdate()为now()

替换Mapper中date_format(#{params.beginTime},‘%y%m%d’)替换成
to_timestamp(#{params.beginTime}, ‘YYYY-mm-dd’)
将 date_format(替换成 to_timestamp(to_char(
将 ‘%y%m%d’)替换成,‘YYYY-mm-dd’), ‘YYYY-mm-dd’)

替换项目中使用的ifnull函数为coalesce,不带括号在这里插入图片描述

部门查询SQL中使用到的find_in_set函数 替换Mapper中find_in_set(#{deptId}, ancestors)为cast(#{deptId} as varchar) = any(string_to_array(ancestors,‘,’))

limit 后跟多参数的情况** 如Mysql里的 Limit 0,8 在pgsql里改为 limit 8**

3.实体类和使用sql语句时注意

mysql支持自动类型转换,postgresql是强类型数据库,特别注意数字与字符串在写SQL时候的区分,字符串必须带单引号,postgresql查询结果集的字段名称,只支持小写!可能会导致设置JavaBean不起作用!

4.运行代码时我的一些常见报错

错误一

## Error querying database.  Cause: org.postgresql.util.PSQLException: 错误: 函数 date_format(timestamp without time zone, unknown) 不存在
  建议:没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型换.

解决方法:对date_format 函数修改参数

MySQL: 
DATE_FORMAT(tme.start_date,'%Y-%m-%d') as startDate,
 
DATE_FORMAT(tme.end_date, '%Y-%m-%d') as endDate,


PostgreSQL: 
to_date(tme.start_date::text,'yyyy-mm-dd') as startDate,

to_date(tme.end_date::text, 'yyyy-mm-dd') as endDate,

MySQL: 
'%Y-%m-%d'  '%Y-%m-%d %H:%i:%s'

PostgreSQL: 
'yyyy-mm-dd' 'yyyy-mm-dd hh24:mi:ss'

注意特殊情况
在这里插入图片描述
前面是字段做转换 后面那个就是参数 不用转换

错误2:操作符不存在

操作符不存在
建议:没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换.

这种很常见的类型转换问题,需要定位错误的语句位置,看对应实体类和数据库中的字段的类型定义,做正确的强制类型转换即可。比如:

select cast(a.course_id AS bigint) as "courseId",
(select string_agg(cast(b.item_id AS varChar),',') from course_task_item,

其他一些更详细的区别可参考
超全mysql转换postgresql数据库方案-爱码代码的林子哥

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值