我目前正在使用mysql作为我的数据库,并使用flyway来管理数据库架构。我的所有单元测试都是针对mysql运行的,并且在添加更多单元测试时运行速度非常慢。现在我想在单元测试中将数据库从mysql更改为h2内存数据库。以下是我对h2 db连接的设置:
#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
当我运行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;
下面是我从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]
我有数百个在mysql中运行良好的sql脚本。所以我不想改变这些脚本中的任何内容。有没有办法让h2接受mysql脚本?
答案 0 :(得分:1)
根据this描述,您可以尝试在MySQL兼容模式下使用H2数据库,方法是在连接字符串中将其设置为MODE=MySQL
。以下是关于它的内容:
要使用MySQL模式,请使用数据库URL
jdbc:h2:~/test;MODE=MySQL
或SQL语句SET MODE MySQL
。
插入数据时,如果列被定义为
NOT NULL
且插入了NULL
,则使用0(或空字符串,或时间戳列的当前时间戳)值。通常,不允许此操作并抛出异常。允许使用
CREATE TABLE
或INDEX(..)
在KEY(..)
语句中创建索引。示例:create table test(id int primary key, name varchar(255), key idx_name(name));
元数据调用以小写形式返回标识符。
将浮点数转换为整数时,小数位不会被截断,但值会四舍五入。
将
NULL
与其他值连接会产生另一个值。默认情况下,MySQL中的文本比较不区分大小写,而在H2中,它区分大小写(与大多数其他数据库一样)。 H2确实支持不区分大小写的文本比较,但需要使用
SET IGNORECASE TRUE
单独设置。这会影响使用=
,LIKE
,REGEXP
的比较。
答案 1 :(得分:1)
您的问题可以通过示例
看到CREATE TABLE `file_storage`
(
'id` BIGINT(64) NOT NULL AUTO_INCREMENT,
`file_name` VARCHAR(45) NULL,
PRIMARY KEY (`id`)
)
DEFAULT CHARACTER SET = utf8;
最后一行“DEFAULT CHARACTER SET = utf8”正在设置mySQL表选项。 H2在表或模式级别没有这样的选项,因为它始终使用Unicode进行操作。
如果你有很多针对MySQL编写的SQL DDL语句,你很可能会发现很多这样的问题。