数据库从Mysql切换到Postgresql常见问题(配置参数和代码修改)RuoYi项目为例
数据库从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数据库方案-爱码代码的林子哥
更多推荐
所有评论(0)