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
将初始化代码添加到 Spring Boot 应用程序的正确方法是啥?
通过 Maven 为 Spring Boot 应用程序创建 AWS Beanstalk 的 .ebextensions 的正确方法是啥