Zha*_* Yi 5 mysql database h2 flyway
我目前正在使用mysql作为数据库,并使用flyway来管理数据库架构。我所有的单元测试都针对mysql运行,并且随着添加更多的单元测试,它们的运行速度非常慢。现在,我想在单元测试中将数据库从mysql更改为h2内存数据库。以下是我对H2数据库连接的设置:
#Datasource
spring.datasource.url=jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE;DATABASE_TO_UPPER=true
spring.datasource.username=
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.default-transaction-isolation-level=1
Run Code Online (Sandbox Code Playgroud)
当我运行flywayMigrate时,出现了一些SQL错误。下面是一个示例,此sql用于在mysql上创建表,但无法在h2上运行。
CREATE TABLE `file_storage` (
`id` BIGINT(64) NOT NULL AUTO_INCREMENT,
`file_name` VARCHAR(45) NULL,
PRIMARY KEY (`id`))
DEFAULT CHARACTER SET = utf8;
Run Code Online (Sandbox Code Playgroud)
下面是我从h2得到的错误。我不知道我的SQL有什么问题。h2是否可以接受mysql数据库模式?
Execution failed for task ':dbschema:flywayMigrate'.
> Error occurred while executing flywayMigrate
Migration V2016_02_26_12_59__create_file_storage.sql failed
-----------------------------------------------------------
SQL State : 42000
Error Code : 42000
Message : Syntax error in SQL statement "CREATE TABLE ""FILE_STORAGE"" (
""ID"" BIGINT(64) NOT NULL AUTO_INCREMENT,
""FILE_NAME"" VARCHAR(45) NULL,
PRIMARY KEY (""ID""))
DEFAULT CHARACTER[*] SET = UTF8 "; SQL statement:
CREATE TABLE `file_storage` (
`id` BIGINT(64) NOT NULL AUTO_INCREMENT,
`file_name` VARCHAR(45) NULL,
PRIMARY KEY (`id`))
DEFAULT CHARACTER SET = utf8 [42000-190]
Location : db/migration/V2016_02_26_12_59__create_file_storage.sql (/Users/yzzhao/dev/cooltoo/cooltoo_backend/dbschema/build/resources/main/db/migration/V2016_02_26_12_59__create_file_storage.sql)
Line : 1
Statement : CREATE TABLE `file_storage` (
`id` BIGINT(64) NOT NULL AUTO_INCREMENT,
`file_name` VARCHAR(45) NULL,
PRIMARY KEY (`id`))
DEFAULT CHARACTER SET = utf8
Syntax error in SQL statement "CREATE TABLE ""FILE_STORAGE"" (
""ID"" BIGINT(64) NOT NULL AUTO_INCREMENT,
""FILE_NAME"" VARCHAR(45) NULL,
PRIMARY KEY (""ID""))
DEFAULT CHARACTER[*] SET = UTF8 "; SQL statement:
CREATE TABLE `file_storage` (
`id` BIGINT(64) NOT NULL AUTO_INCREMENT,
`file_name` VARCHAR(45) NULL,
PRIMARY KEY (`id`))
DEFAULT CHARACTER SET = utf8 [42000-190]
Run Code Online (Sandbox Code Playgroud)
我有数百个在mysql中运行良好的sql脚本。因此,我不想更改这些脚本中的任何内容。有没有办法允许h2接受mysql脚本?
根据这个描述,您可以尝试在 MySQL 兼容模式下使用您的 H2 数据库,方法是将其在连接字符串中设置为MODE=MySQL. 关于它的说法如下:
要使用MySQL模式,请使用数据库URL
jdbc:h2:~/test;MODE=MySQL或SQL语句SET MODE MySQL。
插入数据时,如果定义了某列
NOT NULL并NULL插入了该列,则使用 0(或空字符串,或时间戳列的当前时间戳)值。通常,该操作是不允许的并且会抛出异常。
CREATE TABLE允许在语句中使用INDEX(..)or创建索引KEY(..)。例子:create table test(id int primary key, name varchar(255), key idx_name(name));元数据调用返回小写的标识符。
将浮点数转换为整数时,小数位不会被截断,但值会四舍五入。
与另一个值连接
NULL会产生另一个值。MySQL 中的文本比较默认不区分大小写,而在 H2 中则区分大小写(与大多数其他数据库一样)。H2确实支持不区分大小写的文本比较,但需要单独设置,使用
SET IGNORECASE TRUE. 这会影响使用=,LIKE,的比较REGEXP。