Spring boot: 什么是数据库种子的正确方法?

Spring boot: What is the right way to seed the databse?

我有一个 Spring 启动应用程序,我想在第一次应用程序 运行s 时为数据库播种,但不是每次应用程序 运行s 时,然后只如果数据尚不存在。

我的应用程序有一个 data.sql 文件,我在其中插入了默认用户:

-- insert the administrator
INSERT INTO users(id, username, password_hash, email, first_name, last_name) VALUES
  (1, 'admin', 'comixed', 'email1@domain.com', 'ComixEd', 'Administrator'),
  (2, 'user', 'comixeduser', 'email2@domain.com', 'ComixEd', 'User')
;

-- insert the supported roles
INSERT INTO roles(id, name) VALUES
  (1, 'Administrator'),
  (2, 'User')
;

-- set the administrator roles
INSERT INTO users_roles(user_id, role_id) VALUES
  (1, 1),
  (1, 2),
  (2, 2)
;

但是 Spring 显然在我每次启动应用程序时都试图 运行 这个文件。当它执行时会引发异常,因为用户和角色已经在数据库中。

执行此操作的更好方法是什么?并且,如果将来新功能需要新角色等,可以选择添加新种子数据的方法是什么?

您必须在 application.properties 文件中配置它。 添加这一行,它应该可以如你所愿地工作: spring.jpa.hibernate.ddl-auto = update

Flyway 就是您要找的 https://flywaydb.org/

它是一个数据库迁移工具,可用于在项目中创建和修改数据库。它在您的架构中创建自己的 table 并将脚本名称和校验和值添加到 table 中。在应用程序启动期间,它会扫描脚本,检查它们是否在 table 中以及校验和是否仍然匹配。这可以确保文件不会更改并且所有内容都已迁移。