Open lrkgithub opened 4 years ago
(使用 Spring Boot 来)初始化 SQL 数据库有很多种方式,不同的技术栈有不同的方法。当然,只要数据库是独立运行的,你总可以手动的初始化它(手动执行建表语句)。
JPA
JPA有自动生成DDL(Data Definition Language,数据库模式定义语言)的功能,因此可以在刚启动的时候就对数据库进行操作。有两个外部属性配置可以配置:
DDL(Data Definition Language,数据库模式定义语言)
spring.jpa.generate-ddl
spring.jpa.hibernate.ddl-auto
Hibernate
spring.jpa.hibernate.ddl-auto共有四种值,分别是none,validate,update,create-drop。Spring Boot根据你的数据库是否是内嵌的,会选择不同的默认值。内嵌的数据库(例如, hsqldb, h2, derby)默认值为create-drop,非内嵌的默认值为none。Spring Boot判断数据库是否是内嵌的标准是他们的 连接协议 类型,如果是hsqldb,h2和derby 连接协议,则认为是内嵌的,否则就不是。所以,当你从内嵌式的数据库切换到独立运行的数据库时,需要小心,不能假设数据库中的表会被自动创建。你必须设置ddl-auto,或者其他方式来建表。
none
validate
update
create-drop
hsqldb
h2
derby
连接协议
ddl-auto
另外说一句,import.sql这个文件如果存在 classpath 的根路径位置,那么它会被自动执行。我们建议,这个功能最好只在demo或测试环境中使用,而不要用在真正的生产环境中。这个功能 Spring 也没有关系,他是Hibernate 的功能。
import.sql
Spring JDBC 有一个默认开启的 DataSource 初始化器的功能。它会自动执行在 classpath 根路径下的 schema.sql 文件和 data.sql 文件。这些文件还可以是这样的形式:schema-${platform}.sql 或者 data-${platform}.sql,其中 platform 是 spring.datasource.platform 的值。这个值通常就是数据库的名称,比如 mysql ,postgresql 之类的。始化器默认开启 failfast 的。上面所说的这些脚本的路径,可以通过 spring.datasource.schema 和 spring.datasource.data 配置来修改。spring.datasource.initialize=false 这个配置用来关闭 Spring JDBC 的自动初始化功能。
DataSource
schema.sql
data.sql
schema-${platform}.sql
data-${platform}.sql
platform
spring.datasource.platform
mysql
postgresql
failfast
spring.datasource.schema
spring.datasource.data
spring.datasource.initialize=false
spring.datasource.continueonError=true ,这个配置可以用来关闭 Spring JDBC 的初始化器 failfast 功能。如果你的应用已经很成熟了,不需要在每次部署时,都去修改一下数据的表结构,那么建议配上这个配置,让 Spring Boot 少做无用功。
spring.datasource.continueonError=true
如果你在一个 JPA 应用(指,hibernate)中使用 schema.sql 初始化方式,那么 ddl-auto=create-drop 这个配置会导致错误,原因是 Hibernate 会尝试创建相同的表。这种情况,ddl-auto 应该设置为 “”(更好些),或者 “none”。然而,data.sql 是不会受 ddl-auto=create-drop 的影响的。
ddl-auto=create-drop
数据库初始化
(使用 Spring Boot 来)初始化 SQL 数据库有很多种方式,不同的技术栈有不同的方法。当然,只要数据库是独立运行的,你总可以手动的初始化它(手动执行建表语句)。
1 使用
JPA
初始化数据库JPA
有自动生成DDL(Data Definition Language,数据库模式定义语言)
的功能,因此可以在刚启动的时候就对数据库进行操作。有两个外部属性配置可以配置:spring.jpa.generate-ddl
(boolean),开启或关闭功能。无论什么JPA框架都支持这个属性。spring.jpa.hibernate.ddl-auto
(enum),这是只有Hibernate支持的,能够高级控制的功能。2 使用
Hibernate
初始化数据库spring.jpa.hibernate.ddl-auto
共有四种值,分别是none
,validate
,update
,create-drop
。Spring Boot根据你的数据库是否是内嵌的,会选择不同的默认值。内嵌的数据库(例如,hsqldb
,h2
,derby
)默认值为create-drop
,非内嵌的默认值为none
。Spring Boot判断数据库是否是内嵌的标准是他们的连接协议
类型,如果是hsqldb
,h2
和derby
连接协议,则认为是内嵌的,否则就不是。所以,当你从内嵌式的数据库切换到独立运行的数据库时,需要小心,不能假设数据库中的表会被自动创建。你必须设置ddl-auto
,或者其他方式来建表。另外说一句,
import.sql
这个文件如果存在 classpath 的根路径位置,那么它会被自动执行。我们建议,这个功能最好只在demo或测试环境中使用,而不要用在真正的生产环境中。这个功能 Spring 也没有关系,他是Hibernate 的功能。3 使用 Spring JDBC 初始化数据库
Spring JDBC 有一个默认开启的
DataSource
初始化器的功能。它会自动执行在 classpath 根路径下的schema.sql
文件和data.sql
文件。这些文件还可以是这样的形式:schema-${platform}.sql
或者data-${platform}.sql
,其中platform
是spring.datasource.platform
的值。这个值通常就是数据库的名称,比如mysql
,postgresql
之类的。始化器默认开启failfast
的。上面所说的这些脚本的路径,可以通过spring.datasource.schema
和spring.datasource.data
配置来修改。spring.datasource.initialize=false
这个配置用来关闭 Spring JDBC 的自动初始化功能。spring.datasource.continueonError=true
,这个配置可以用来关闭 Spring JDBC 的初始化器failfast
功能。如果你的应用已经很成熟了,不需要在每次部署时,都去修改一下数据的表结构,那么建议配上这个配置,让 Spring Boot 少做无用功。如果你在一个 JPA 应用(指,hibernate)中使用
schema.sql
初始化方式,那么ddl-auto=create-drop
这个配置会导致错误,原因是 Hibernate 会尝试创建相同的表。这种情况,ddl-auto
应该设置为 “”(更好些),或者 “none”。然而,data.sql
是不会受ddl-auto=create-drop
的影响的。