若依管理系统默认使用 MySQL
作为数据库,本教程将指导您如何将其切换为 PostgreSQL
,包括引入驱动、修改配置文件及调整兼容性,以确保系统正常运行。
首先,我们需要在 ruoyi-admin
项目中引入 PostgreSQL 的数据库驱动。
在 pom.xml
文件中添加以下依赖项:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.18</version>
</dependency>
接下来,修改数据源的配置,将其切换为 PostgreSQL。
在 application-druid.yml
中,将数据源配置更新为如下格式:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: org.postgresql.Driver
druid:
master:
url: jdbc:postgresql://192.168.119.128:5432/FDS?stringtype=unspecified
username: postgres
password: ts123456
提示:
stringtype=unspecified
是用于避免某些字段类型转换错误的问题。
由于 PostgreSQL 不支持 dual
表,需将 validationQuery
的值从 SELECT 1 FROM DUAL
修改为 SELECT version()
以验证数据库连接是否正常:
validationQuery: SELECT version()
在 application.yml
中,将 PageHelper
插件的方言设置为 PostgreSQL:
pagehelper:
helperDialect: postgresql
supportMethodsArguments: true
params: count=countSql
在迁移到 PostgreSQL 后,需要对 MySQL 特定的函数和语法进行替换:
sysdate()
函数替换为 now()
ifnull(字段, '')
函数替换为 COALESCE(字段, '')
status = 0
修改为 status = '0'
(PostgreSQL 需要对 char
类型的值添加单引号)dual
表引用,例如 'query'
,直接改为 query
database()
函数替换为 CURRENT_SCHEMA()
这些更改可以通过在 mapper.xml
文件中全局搜索相关语句并替换来完成。
PostgreSQL 中,自动递增的主键字段需使用序列。对于使用自增主键的表,需要添加自增序列,并设置主键字段的默认值。
以下是一些示例:
CREATE SEQUENCE sys_user_id_seq START WITH 3 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;
ALTER TABLE sys_user ALTER COLUMN user_id SET DEFAULT nextval('sys_user_id_seq');
-- 从当前最大 id 开始递增
-- SELECT setval('sys_user_id_seq', (SELECT max(user_id) FROM sys_user));
-- 操作日志表
CREATE SEQUENCE sys_oper_log_id_seq START WITH 3 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;
ALTER TABLE sys_oper_log ALTER COLUMN oper_id SET DEFAULT nextval('sys_oper_log_id_seq');
-- 角色表
CREATE SEQUENCE sys_role_id_seq START WITH 3 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;
ALTER TABLE sys_role ALTER COLUMN role_id SET DEFAULT nextval('sys_role_id_seq');
-- 通知表
CREATE SEQUENCE sys_notice_id_seq START WITH 3 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;
ALTER TABLE sys_notice ALTER COLUMN notice_id SET DEFAULT nextval('sys_notice_id_seq');
提示:可以使用以下 SQL 查询查看所有的序列:
SELECT 'CREATE SEQUENCE ' || sequence_name || ' START ' || start_value || ';' FROM information_schema.sequences;
若创建的序列不正确,可使用以下命令删除再重新创建:
DROP SEQUENCE sequence_name;
对于 char
类型且具有默认值的字段,必须在 Navicat
等数据库工具中手动添加默认值,并且确保值加上单引号。例如:
sys_user
、sys_role
、sys_dept
表的 del_flag
、status
字段设置默认值 '0'
sys_menu
、sys_post
、sys_notice
、sys_logininfor
、sys_job_log
、sys_dict_type
、sys_dict_data
表的 status
字段同样设置默认值为 '0'
针对部分代码与 PostgreSQL 的兼容性问题,也需要进行代码调整:
SysRole.java
中的 menuCheckStrictly
和 deptCheckStrictly
类型改为 int
index.vue
文件中 menuCheckStrictly
和 deptCheckStrictly
的默认值从 true
修改为 1
.vue
文件中全局搜索“父子联动”相关内容,并将其注释掉此外,在 GenTableMapper.xml
文件中,修改查询语句以兼容 PostgreSQL 的信息架构表:
<select id="selectDbTableList" parameterType="GenTable" resultMap="GenTableResult">
select * from information_schema.tables
where table_schema = (select CURRENT_SCHEMA())
AND table_name NOT LIKE 'qrtz_%' AND table_name NOT LIKE 'gen_%'
AND table_name NOT IN (select table_name from gen_table)
<if test="tableName != null and tableName != ''">
AND lower(table_name) like lower(concat('%', #{tableName}, '%'))
</if>
</select>
如果希望简化系统,仅使用若依提供的封装工具类,可以通过去除数据库校验来实现。将以下类中的 init
构造函数去除即可:
com/ruoyi/system/service/impl/SysConfigServiceImpl.java
SysDictTypeServiceImpl:位于 com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java
SysJobServiceImpl:位于 com/ruoyi/quartz/service/impl/SysJobServiceImpl.java
完成上述修改后,即可成功将若依管理系统的数据源切换为 PostgreSQL,同时保持系统的功能正常运行。
powered by kaifamiao