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

1.配置参数修改

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

org.postgresql

postgresql

runtime

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数据库方案-爱码代码的林子哥

文章链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: