【发布时间】:2020-04-29 18:18:06
【问题描述】:
我将flyway 与我的SpringBoot 应用程序一起使用。数据库是MySQL。 flyway脚本中的cmets以#开头。
当我尝试编写 H2 测试时,它无法加载 ApplicationContext 并出现错误。
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.internal.command.DbMigrate$FlywayMigrateException:
Migration V0_0_1__init.sql failed
-------------------------------------------------
SQL State : 42000
Error Code : 42000
Message : Syntax error in SQL statement "[*]# types
INSERT INTO `users`.`TYPES` (NAME) VALUES (""Bob"") "; SQL statement:
# Types
INSERT INTO `users`.`types` (name) VALUES ("Bob") [42000-199]
Location : db/migration/V0_0_1__init.sql (/myapp/target/classes/db/migration/V0_0_1__init.sql)
Line : 1
Statement : # Types
INSERT INTO `users`.`types` (name) VALUES ("Bob")
据我所知,H2 不会将以 # 开头的行视为 cmets,但 MySQL 会。有没有办法让H2 将SQL 脚本中的# 视为cmets?
我什至在我的application-test.properties 中将模式设置为MySQL,并使用h2-test 配置文件进行测试。
spring.datasource.url=jdbc:h2:myapp;MODE=MySQL;INIT=CREATE SCHEMA IF NOT EXISTS myapp;
【问题讨论】:
-
H2 仅支持标准的
--和/* */cmets 以及非标准的//cmets,并且没有针对它们的配置设置。 MySQL 支持两种类型的标准 cmets 和非标准的#cmets。您应该只使用标准 cmets 来避免此类问题。当使用标准 SQL 可以轻松实现相同的目标时,不要使用供应商特定的功能,尤其是当您使用多个数据库系统时。
标签: mysql spring-boot h2 flyway