在 Spring Boot 项目里进行数据库迁移,其目的是保证数据库结构在不同环境和版本间保持一致,同时能顺利升级或回滚数据库。下面为你介绍几种常用的数据库迁移工具及其使用方法。
Flyway
Flyway 是一款简单易用的数据库迁移工具,它借助版本化的 SQL 脚本管理数据库变更。
步骤
- 添加依赖:在
pom.xml
里添加 Flyway 的依赖。
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
- 配置 Flyway:在
application.properties
或者application.yml
中配置 Flyway。
spring.flyway.enabled=true
spring.flyway.url=jdbc:mysql://localhost:3306/your_database
spring.flyway.user=your_username
spring.flyway.password=your_password
- 创建迁移脚本:在
src/main/resources/db/migration
目录下创建 SQL 脚本,文件名需遵循V<版本号>__<描述>.sql
的格式,例如V1__Create_users_table.sql
。
-- V1__Create_users_table.sql
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE
);
- 运行迁移:启动 Spring Boot 应用程序,Flyway 会自动检测并执行未执行过的迁移脚本。
Liquibase
Liquibase 是一个强大的数据库重构和迁移工具,支持 XML、YAML、JSON 和 SQL 格式的迁移脚本。
步骤
- 添加依赖:在
pom.xml
中添加 Liquibase 的依赖。
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
- 配置 Liquibase:在
application.properties
或者application.yml
中配置 Liquibase。
spring.liquibase.enabled=true
spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.yaml
- 创建迁移脚本:在
src/main/resources/db/changelog
目录下创建主变更日志文件db.changelog-master.yaml
,并在其中引用其他变更日志文件。
# db.changelog-master.yaml
databaseChangeLog:
- include:
file: db.changelog-1.0.yaml
在 db.changelog-1.0.yaml
中编写具体的迁移脚本。
# db.changelog-1.0.yaml
databaseChangeLog:
- changeSet:
id: 1
author: you
changes:
- createTable:
tableName: users
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: name
type: varchar(255)
constraints:
nullable: false
- column:
name: email
type: varchar(255)
constraints:
nullable: false
unique: true
- 运行迁移:启动 Spring Boot 应用程序,Liquibase 会自动检测并执行未执行过的迁移脚本。
Spring Boot Data JPA 的 Schema Generation
若项目使用 Spring Boot Data JPA,可借助 JPA 的 spring.jpa.hibernate.ddl-auto
属性进行数据库迁移。
步骤
- 配置 JPA:在
application.properties
或者application.yml
中配置 JPA 的ddl-auto
属性。
spring.jpa.hibernate.ddl-auto=update
ddl-auto
有以下几种取值:
create
:每次启动应用时都会创建新的数据库表,会删除原有的表。create-drop
:启动时创建表,关闭应用时删除表。update
:依据实体类的变化更新数据库表结构。validate
:验证实体类和数据库表结构是否一致,若不一致则抛出异常。none
:不进行任何表结构的修改。
- 定义实体类:创建 JPA 实体类,JPA 会依据实体类的定义生成数据库表结构。
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getters and setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
总结
- Flyway:操作简单,适合简单项目,以 SQL 脚本管理数据库变更。
- Liquibase:功能强大,支持多种格式的迁移脚本,适合复杂项目。
- Spring Boot Data JPA 的 Schema Generation:适合快速开发和测试环境,不适用于生产环境的数据库迁移。