数据库初始化
SQL 数据库的初始化方式可以根据你的栈类型不同而有所不同。 当然,你也可以手动作,前提是数据库是独立的流程。 建议使用单一机制来生成模式。
使用休眠初始化数据库
你可以设置spring.jpa.hibernate.ddl-auto以控制休眠的数据库初始化。
支持的值有没有,驗證,更新,创造和创作-丢弃.
Spring Boot 会根据你是否使用嵌入式数据库来为你选择默认值。
嵌入式数据库通过观察连接输入并填写JDBC网址。hsqldb,H2或德比是嵌入式数据库,而其他数据库则不是。
如果已识别到嵌入数据库,但尚未检测到模式管理器(Flyway 或 Liquibase),DDL-自动默认为创作-丢弃.
在其他情况下,默认为没有.
从内存内切换到“真实”数据库时,要小心不要对新平台上的表和数据存在做假设。
你要么设置DDL-自动显式或使用其他机制初始化数据库。
你可以通过启用org.hibernate.SQL记录。
如果你启用调试模式,这个过程会自动帮你完成。 |
此外,还有一个名为import.sql如果 Hibernate 从零创建模式(即DDL-自动属性设置为创造或创作-丢弃).
如果你小心,这对演示和测试很有用,但可能不是你想在生产环境中进入类路径的。
这是Hibernate特性(和Spring无关)。
使用基础SQL脚本初始化数据库
默认情况下,它会从以下加载模式脚本optional:classpath*:schema.sql以及来自的数据脚本optional:classpath*:data.sql.
这些模式和数据脚本的位置可以通过以下方式进行自定义spring.sql.init.schema-locations和spring.sql.init.data-locations分别。
这自选:前缀意味着即使文件不存在,应用程序也会启动。
如果应用程序在文件缺失时无法启动,请移除自选:前缀。
此外,Spring Boot 还处理optional:classpath*:schema-${platform}.sql和Optional:classpath*:d ata-${platform}.sql文件(如果存在),其中${platform}是 的值spring.sql.init.platform.
这样你就可以在必要时切换到数据库专用脚本。
例如,你可以选择将其设置为数据库的提供商名称(hsqldb,H2,神谕,MySQL,PostgreSQL,依此类推)。
默认情况下,SQL数据库初始化仅在使用嵌入式内存数据库时执行。
无论SQL数据库类型如何,都要始终初始化,集合spring.sql.init.mode自总是.
同理,要禁用初始化,设spring.sql.init.mode自从不.
默认情况下,Spring Boot 启用了其基于脚本的数据库初始化器的快速失败功能。
这意味着,如果脚本引发异常,应用程序将无法启动。
你可以通过设置来调整这种行为spring.sql.init.continue-on-error.
基于脚本数据来源初始化默认在任何 JPA 之前进行EntityManagerFactory豆子被创造出来。schema.sql可用于创建JPA管理实体的模式,且data.sql可以用来填充它。
虽然我们不建议使用多个数据源初始化技术,但如果你想要基于脚本的话数据来源初始化以构建由 Hibernate 执行的模式创建,设置spring.jpa.defer-datasource-initialization自true.
这会将数据源初始化推迟到任何EntityManagerFactory豆子已经被创建并初始化。schema.sql然后可以用来对Hibernate执行的任何模式创建进行添加,并且data.sql可以用来填充它。
初始化脚本支持单行注释和块注释。
不支持其他评论格式。--/* */ |
如果你使用更高级的数据库迁移工具,比如Flyway或Liquibase,应该单独使用它们来创建和初始化模式。
使用基础schema.sql和data.sql不建议脚本与 Flyway 或 Liquibase 并存,未来版本中将取消支持。
初始化一个 Spring 批次数据库
如果你用 Spring Batch,它预先包含了大多数主流数据库平台的 SQL 初始化脚本。 Spring Boot 可以检测你的数据库类型,并在启动时执行这些脚本。 如果你使用嵌入式数据库,默认情况下会发生这种情况。 你也可以为任何数据库类型启用,如下示例所示:
-
Properties
-
YAML
spring.batch.jdbc.initialize-schema=always
spring:
batch:
jdbc:
initialize-schema: "always"
你也可以通过设置明确关闭初始化Spring.batch.jdbc.initialize-schema自从不.
使用更高级的数据库迁移工具
启动时执行Flyway数据库迁移
要在启动时自动运行 Flyway 数据库迁移,请在你的类路径中添加相应的 Flyway 模块。
内存和基于文件的数据库支持以下org.flywaydb:flyway-core.
否则,则需要数据库专用模块。
例如,使用org.flywaydb:flyway-database-postgresql与PostgreSQL合作org.flywaydb:flyway-mysql使用MySQL。
详情请参见迁徙路线文档。
通常,迁移是以下形式的文字V<VERSION>__<NAME>.sql(其中<版本>带有下划线分隔的版本,如“1”或“2_1”)。
默认情况下,它们存在于一个名为ClassPath:DB/迁移但你可以通过设置来修改该位置spring.flyway.locations.
这是一个逗号分隔的列表,包含一个或多个Classpath:或文件系统:地点。
例如,以下配置会在默认类路径位置和/opt/迁移目录:
-
Properties
-
YAML
spring.flyway.locations=classpath:db/migration,filesystem:/opt/migration
spring:
flyway:
locations: "classpath:db/migration,filesystem:/opt/migration"
你也可以添加特殊技能{提供商}占位符,以便使用厂商特定的脚本。
假设以下情况:
-
Properties
-
YAML
spring.flyway.locations=classpath:db/migration/{vendor}
spring:
flyway:
locations: "classpath:db/migration/{vendor}"
而不是使用数据库/迁移,前述配置根据数据库类型(例如)设置目录的使用顺序数据库/迁移/MySQL用于 MySQL)。
支持的数据库列表可见于数据库驱动.
迁移也可以用Java编写。
Flyway 将自动配置任何实现的豆子Java迁移.
迁徙性质提供了大部分 Flyway 的设置,以及一小部分可用于禁用迁移或关闭位置检查的附加属性。
如果你需要对配置有更多控制,可以考虑注册一个FlywayConfigurationCustomizer豆。
Flyway 支持 SQL 和 Java 回调。
要使用基于SQL的回调,请将回调脚本置于ClassPath:DB/迁移目录。
要使用基于Java的回调,可以创建一个或多个实现的豆子回调.
任何此类豆子都会自动注册于飞行路线.
它们可以通过以下方式排序@Order或者通过实现命令.
默认情况下,Flyway 会自动接线 (@Primary) 数据来源在你的语境下,并用它来进行迁移。
如果你喜欢用不同的方法数据来源你可以创建一个并标记它@Bean如@FlywayDataSource.
如果你这样做并且想要两个数据源(比如保留主数据的自动配置)数据来源),记得设置默认候选人属性@Bean注释false.
或者,你也可以使用 Flyway 的原生数据来源按环境分类Spring。飞翔路线。[URL,用户,密码]在外部属性中。
设定Spring.飞路.URL或spring.flyway.user足以让Flyway使用自己的数据来源.
如果这三个属性中的任何一个都未被设置,则其等价项的值spring.datasource财产将被使用。
你也可以用Flyway为特定场景提供数据。
例如,你可以在SRC/测试/资源而且它们只在你的应用开始测试时运行。
此外,你也可以使用配置文件特定的配置来自定义spring.flyway.locations因此,某些迁移只在特定配置文件激活时运行。
例如,在application-dev.properties,你可以指定以下设置:
-
Properties
-
YAML
spring.flyway.locations=classpath:/db/migration,classpath:/dev/db/migration
spring:
flyway:
locations: "classpath:/db/migration,classpath:/dev/db/migration"
有了这样的设置,迁移就在开发/数据库/迁移仅当开发个人资料已激活。
启动时执行Liquibase数据库迁移
要在启动时自动运行 Liquibase 数据库迁移,请添加org.liquibase:liquibase-core去你的班级路径。
|
当你添加 |
默认情况下,主变更日志是从以下读取的db/changelog/db.changelog-master.yaml但你可以通过设置来更改位置spring.liquibase.change-log.
除了 YAML,Liquibase 还支持 JSON、XML 和 SQL 变更日志格式。
默认情况下,Liquibase 会自动接线 (@Primary) 数据来源在你的语境下,并用它来进行迁移。
如果你需要用不同的方法数据来源你可以创建一个并标记它@Bean如@LiquibaseDataSource.
如果你这样做并且想要两个数据源(比如保留主数据的自动配置)数据来源),记得设置默认候选人属性@Bean注释false.
或者,你也可以使用 Liquibase 的原生数据来源按环境分类春季.liquibase。[driver-class-name, URL, user, password]在外部属性中。
设定spring.liquibase.url或spring.liquibase.user足以使 Liquibase 使用自身数据来源.
如果这三个属性中的任何一个都未被设置,则其等价项的值spring.datasource财产将被使用。
看LiquibaseProperties(液碱性质)关于可用设置的详细信息,如上下文、默认模式等。
你也可以使用定制<Liquibase>如果你想定制液基碱在使用之前的实例。
仅用于测试迁移,使用Flyway。
如果你想创建Flyway迁移来填充你的测试数据库,可以把它们放在SRC/测试/资源/数据库/迁移.
例如,一个名为src/test/resources/db/migration/V9999__test-data.sql它将在生产迁移后执行,且仅在你运行测试时执行。
你可以用这个文件来创建所需的测试数据。
这个文件不会被打包在你的Uber罐子或容器里。
使用 Liquibase 进行仅测试迁移
如果你想创建Liquibase迁移来填充你的测试数据库,你必须创建一个测试变更日志,同时包含生产变更日志。
首先,你需要配置Liquibase在运行测试时使用不同的变更日志。
一种方法是创建一个Spring靴测试然后把Liquibase属性放进去。
为此,创建一个名为src/test/resources/application-test.properties并放入以下属性:
-
Properties
-
YAML
spring.liquibase.change-log=classpath:/db/changelog/db.changelog-test.yaml
spring:
liquibase:
change-log: "classpath:/db/changelog/db.changelog-test.yaml"
这会让 Liquibase 在运行时使用不同的更新日志测试轮廓。
现在创建更新日志文件src/test/resources/db/changelog/db.changelog-test.yaml:
databaseChangeLog:
- include:
file: classpath:/db/changelog/db.changelog-master.yaml
- changeSet:
runOrder: "last"
id: "test"
changes:
# Insert your changes here
这份变更日志将在测试运行时使用,不会被打包在你的 Uber jar 或容器中。
它包含生产变更日志,然后声明一个新的变更集,其变更集运行顺序:最后设置指定在所有生产变更集运行后运行。
例如,你现在可以用插入变更集插入数据,或者用SQL变更集直接执行SQL。
最后要做的是配置 Spring Boot 来激活测试运行测试时使用配置文件。
为此,你可以添加@ActiveProfiles(“测试”)注释至你的@SpringBootTest带注释的测试类。
依赖初始化数据库
数据库初始化是在应用程序启动时作为应用上下文刷新的一部分进行的。 为了在启动时允许访问已初始化的数据库,会自动检测作为数据库初始化器的 Beans 和需要该数据库已初始化的 Beans。 初始化依赖于数据库初始化的豆子,会被配置为依赖初始化数据库的豆子。 如果启动时应用尝试访问数据库但尚未初始化,你可以配置额外的豆子检测,初始化数据库并要求数据库已初始化。
检测数据库初始化器
Spring Boot 会自动检测以下类型的 BEN 初始化 SQL 数据库:
如果你使用第三方的数据库初始化库,它可能提供检测器,使其他类型的豆子也能自动检测。
为了检测到其他豆子,注册一个实现数据库初始化检测器在META-INF/spring.factories.
检测依赖数据库初始化的豆子
Spring Boot 会自动检测以下类型的豆子,具体取决于数据库初始化:
-
摘要EntityManagerFactoryBean(除非spring.jpa.defer-datasource-initialization设置为true) -
DSLContext(笑) -
EntityManagerFactory(除非spring.jpa.defer-datasource-initialization设置为true)
如果你使用第三方的起始数据访问库,它可能提供检测器,使其他类型的豆子也能自动检测到。
为了检测到其他豆子,注册一个实现DependsOnDatabase初始化检测器在META-INF/spring.factories.
或者,给豆子的类或其类做注释@Bean方法:@DependsOnDatabaseInitialization.