【问题标题】:Importing Data with spring boot使用 Spring Boot 导入数据
【发布时间】:2016-01-23 06:26:08
【问题描述】:

我的 flyway 和 spring-boot 工作正常,但我似乎无法正确连接我的 spring.datasource.data

如果我有一个文件src/main/resources/db/seeds/one_project.sql。我在application.properties 文件中尝试了以下内容。

# fully qualified path
spring.datasource.data=file:///fully/qualified/path/db/seeds/one_project.sql

# classpath specific
spring.datasource.data=classpath:/db/seeds/one_project.sql

# relative path
spring.datasource.data=/db/seeds/one_project.sql

我唯一能真正开始工作的就是将one_project.sql复制到src/main/resources/schema.sql(即使复制到src/main/resources/data.sql也行不通。

我在文档中完全遗漏了什么吗?

我一直在关注文档here

提前感谢您的帮助!

【问题讨论】:

  • 迁移脚本的默认位置是 'src/resources/db/migration' 目录。来自 FlywayProperties 类。 /** * Locations of migrations scripts. */ private List<String> locations = Arrays.asList("db/migration");
  • 其实 Flyway 在这里是错误的标签,因为你不使用任何 Flyway 功能,如果你想按照你描述的方式导入数据。这是简单的 Spring JDBC 数据库初始化。
  • 我删除了 Flyway 标签。 @AntonNovopashin 我的迁移工作正常,这是关于播种数据,而不是迁移架构。我想给它一些初始数据
  • @Alex 您可以使用 Flyway/Liquibase 加载初始数据。
  • @AntonNovopashin 我希望 flyway 管理我的迁移,以便当我部署到 prod 时它会迁移架构,但我不想在部署时放置假数据。我想要一个单独的 SQL 脚本,可以在开发环境中使用,但不能在生产环境中使用

标签: spring-boot


【解决方案1】:

坚持了很长时间。 我的上下文:Spring Boot 2.2.6 + Hibernate 5.4 + 类路径(src/main/resources)中的 script.sql。 要在应用程序启动时执行脚本,我需要添加 application.properties:

spring.datasource.initialization-mode=always
spring.jpa.hibernate.ddl-auto=update
spring.datasource.data=classpath:script.sql

并删除 script.sql 中实际代码和 BETWEEN 代码之前的所有 cmets。 或者,如果您需要 cmets,请在带有注释的行之后的下一行添加 SELECT 1;。因为评论后的下一行似乎被忽略了。无论您粘贴评论后有多少个换行符。

【讨论】:

  • 我发现 cmets 问题只出现在 # cmets 上。使用--/* */ cmets 没有问题。
【解决方案2】:

如我所见,如果以下条件之一为真,Spring Boot 会执行数据脚本:

  • schema.sql 脚本存在且初始化已启用 (spring.datasource.initialize=true)
  • 如果使用 JPA 和 Hibernate 并通过 Spring Boot 自动配置:属性 hibernate.hbm2ddl.auto 存在(值无关紧要,您可以给它一个空字符串或只是“验证”)并启用初始化(spring.datasource.initialize=true)。

【讨论】:

  • 我加了spring.datasource.initialize=true,没有效果。
  • 好吧,请仔细阅读我的回答,这只是您需要的一部分。你使用 Hibernate 和 JPA 吗?
  • 我已经定义了 hibernate.hbm2ddl.auto 属性,所以唯一缺少的是 spring.datasource.initialize=true 。还是没有变化
  • @Alex 也许是个愚蠢的问题,但你的类路径上有 Hibernate 吗?
  • @AndyWilkinson 是的,使用 hibernate 将数据读取和写入数据库工作
【解决方案3】:

TL;DR

Create a blank schema.sql if you want your data.sql to run.
Also as stated in a comment it must execute one line such as `select 1` or `select 1 from dual`

你说

我唯一能真正开始工作的就是将 one_project.sql 复制到 src/main/resources/schema.sql

这让我觉得很明显你没有 schema.sql

所以只需创建一个空白的 schema.sql,然后它将运行 one_project.sql

源代码-https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitializer。爪哇

如您所见,它收集架构位置,如果架构资源为空,则不会继续运行 data.sql(这是在 runSchemaScripts() 方法的顶部)

【讨论】:

  • 这不再有效,因为 Spring 抛出了 schema.sql 不能为空的异常
  • @BartlomiejLewandowski 是真的。评论是不够的。解决方法类似于“SELECT 1 from dual;”在schema.sql
【解决方案4】:

我让它工作的方式是使用以下属性

 spring.datasource.data=classpath:prod.sql
 spring.datasource.url=jdbc:mysql://localhost:3306/DATABASENAME?useSSL=false
 spring.datasource.username=USERNAME
 spring.datasource.password=PASSWORD
 spring.datasource.initialization-mode=always 

spring.datasource.initialization-mode=always 似乎可以解决问题

【讨论】:

  • 如果您使用的是套接字?比如: url: jdbc:mysql://google/${CLOUD_SQL_DATABASE_NAME:marketplace}?cloudSqlInstance=${DEVSHELL_PROJECT_ID:qwiklabs-gcp-03-c2ba3b787460}:us-central1:mysql-db-container&socketFactory=com.google.cloud。 sql.mysql.SocketFactory
  • 谢谢,它有效。如果您使用 maven,有时需要重新导入项目以更新类路径。
【解决方案5】:

尝试使用类路径*,如下所示:

spring.datasource.schema=classpath*:db/seeds/your_schema.sql
spring.datasource.data=classpath*:db/seeds/one_project.sql

【讨论】:

  • 或者如果结构resources/sql/file1.sql和file2.sql存在,那么使用:spring.datasource.data=classpath:sql/file1.sql, classpath:sql/file2.sql
猜你喜欢
  • 2021-02-12
  • 2019-07-10
  • 1970-01-01
  • 2017-04-20
  • 2015-11-16
  • 2017-08-22
  • 2016-02-28
  • 1970-01-01
  • 2020-11-11
相关资源
最近更新 更多