开发喵星球

若依切换数据源为 PostgreSQL(380)

若依管理系统默认使用 MySQL 作为数据库,本教程将指导您如何将其切换为 PostgreSQL,包括引入驱动、修改配置文件及调整兼容性,以确保系统正常运行。

1. 引入 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 是用于避免某些字段类型转换错误的问题。

2. 配置连接验证语句及分页插件

2.1. 连接验证查询语句

由于 PostgreSQL 不支持 dual 表,需将 validationQuery 的值从 SELECT 1 FROM DUAL 修改为 SELECT version() 以验证数据库连接是否正常:

validationQuery: SELECT version()

数据库连接验证

2.2. 配置分页插件

application.yml 中,将 PageHelper 插件的方言设置为 PostgreSQL:

pagehelper:
  helperDialect: postgresql
  supportMethodsArguments: true
  params: count=countSql

3. 语法与函数的兼容性调整

在迁移到 PostgreSQL 后,需要对 MySQL 特定的函数和语法进行替换:

这些更改可以通过在 mapper.xml 文件中全局搜索相关语句并替换来完成。

4. 设置自增序列

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;

5. 设置默认值与单引号

对于 char 类型且具有默认值的字段,必须在 Navicat 等数据库工具中手动添加默认值,并且确保值加上单引号。例如:

设置默认值

6. 修改代码

针对部分代码与 PostgreSQL 的兼容性问题,也需要进行代码调整:

此外,在 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>

7. 去除数据库校验

如果希望简化系统,仅使用若依提供的封装工具类,可以通过去除数据库校验来实现。将以下类中的 init 构造函数去除即可:

完成上述修改后,即可成功将若依管理系统的数据源切换为 PostgreSQL,同时保持系统的功能正常运行。

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-11-04 15:46:09 阅读量:64
<<   >>


powered by kaifamiao