Spring Boot:播种数据库的正确方法是啥?

Posted

技术标签:

【中文标题】Spring Boot:播种数据库的正确方法是啥?【英文标题】:Spring boot: What is the right way to seed the databse?Spring Boot:播种数据库的正确方法是什么? 【发布时间】:2018-05-23 16:02:49 【问题描述】:

我有一个 Spring Boot 应用程序,并希望在应用程序第一次运行时为数据库播种,但不是每次应用程序运行时都为数据库播种,并且仅在数据不存在时才播种。

我的应用程序有一个 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 显然在我每次启动应用程序时都试图运行这个文件。并且当它执行时会引发异常,因为用户和角色已经在数据库中。

有什么更好的方法来做到这一点?并且,如果将来新功能需要新角色等,有什么方法可以添加新的种子数据?

【问题讨论】:

也许您应该尝试使用更高级别的数据库迁移工具,例如 Flyway 或 Liquibase (relevant documentation)。 【参考方案1】:

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

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

【讨论】:

这更符合我想要的。这听起来类似于 Rails 迁移的工作方式。谢谢。【参考方案2】:

您必须在application.properties 文件中配置它。 添加此行,它应该可以按您的意愿工作: spring.jpa.hibernate.ddl-auto = update

【讨论】:

我不是在问如何创建表,而是在创建表后如何将数据放入表中。你的解决方案没有解决这个问题。 很抱歉我错过了部分解决方案。我之前的做法是将inserts 写入一个名为import.sql 的文件中,该文件与application.properties 位于同一文件夹级别。 Spring 会自动查找该特定文件来进行播种。您可能会发现这很有用docs.spring.io/spring-boot/docs/current/reference/html/… 每次运行应用程序都会完成 import.sql 文件。我一直在寻找一种只运行一次导入的解决方案,因为我最初只是想为数据库播种。 然后,在application.properties中配置属性spring.jpa.hibernate.ddl-auto = create-drop,运行项目,之后改成none或者update,就不会再做这个过程了.同样,我建议阅读文档。 @Amit 是的,我最终做的是将 Liquibase 添加到我的项目中,并依靠它来管理架构并执行表的迁移和播种。我上面的回复提到了 FlywayDB,但我们放弃了它,并在我发布后不久就去了 Liquibase。

以上是关于Spring Boot:播种数据库的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring-Boot 播种 Spring-Security

mysql数据库没有被spring boot播种

Spring Boot 更新用户数据的最佳方法是啥?

将初始化代码添加到 Spring Boot 应用程序的正确方法是啥?

通过 Maven 为 Spring Boot 应用程序创建 AWS Beanstalk 的 .ebextensions 的正确方法是啥

播种初始数据 - 使用 data.sql 的 Spring Boot