Ruoyi从MySQL切换到PostgreSQL的几个踩坑实战
在使用Ruoyi框架时切换数据库是一个常见的需求,但是从MySQL切换到PostgreSQL这个过程中存在一些坑点,本文将详细讲解如何解决这些问题。
准备工作
在开始切换之前,需要确保具备以下条件:
- 已经安装好PostgreSQL,并且开启了远程访问功能。
- 确认Ruoyi框架的版本支持PostgreSQL,可参考 官方文档。
- 确认原先使用的MySQL数据库中的数据可以导出到PostgreSQL数据库中。
步骤一:修改pom.xml文件
在pom.xml文件中添加PostgreSQL数据库驱动的依赖,这是连接PostgreSQL数据库的基础:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.18</version>
</dependency>
步骤二:配置数据源
修改 application-prod.yml 文件,使用spring.datasource下的url、username、password三个属性替换掉原先的MySQL配置,并将驱动改为PostgreSQL的驱动。
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:postgresql://127.0.0.1:5432/ruoyi?currentSchema=public
username: postgres
password: 123456
filters: stat,wall
driver-class-name: org.postgresql.Driver
maxActive: 20
initialSize: 1
maxWait: 60000
需要注意的是,url中的currentSchema属性指定当前使用的Schema,需要根据实际情况进行修改。
步骤三:修改MyBatis的配置文件
修改 MyBatis 的配置文件 mybatis-config.xml,将原先的MySQL的MyBatis驱动改为PostgreSQL的驱动:
<configuration>
<typeAliases>
<!-- 其他配置省略 -->
</typeAliases>
<plugins>
<!-- 其他配置省略 -->
</plugins>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql://127.0.0.1:5432/ruoyi?currentSchema=public"/>
<property name="username" value="postgres"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 其他配置省略 -->
</mappers>
</configuration>
步骤四:数据迁移
使用 PostgreSQL 的工具将 MySQL 数据库中的数据迁移至 PostgreSQL 数据库中。
例如使用 pgloader 工具,可使用以下命令进行数据迁移:
pgloader mysql://user:password@hostname/database postgresql://user:password@hostname/ccddb
以上命令中,第一个参数表示 MySQL 的数据库连接信息,第二个参数表示 PostgreSQL 的数据库连接信息。
示例1:自定义SQL语句
在使用 Ruoyi 的查询功能时常常需要使用自定义SQL语句,这时候需要确认SQL语句兼容 PostgreSQL 数据库,以防出现语法错误。
例如原先使用的MySQL的自定义SQL语句:
<sql id="database.schema">
`ruoyi` .
</sql>
如果需要在 PostgreSQL 数据库中使用,建议修改为:
<sql id="database.schema">
"public".
</sql>
示例2:时间类型的问题
在使用 PostgreSQL 数据库时,需要注意时间类型的存储方式的不同。在MySQL中可以使用Date、DateTime类型,而在 PostgreSQL中需要使用Timestamp类型来存储时间信息。
因此在使用时间类型时,需要将对应的类型进行修改。
例如:
// 原先MySQL中
@Column(name="create_time")
private Date createTime;
// 修改后
@Column(name="create_time")
private Timestamp createTime;
结语
通过以上修改过程,可以成功将Ruoyi从MySQL切换到PostgreSQL,同时避免出现数据迁移和语法错误等问题。