如何使mysql数据库架构与h2数据库兼容

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脚本?

Sta*_*lav 8

根据这个描述,您可以尝试在 MySQL 兼容模式下使用您的 H2 数据库,方法是将其在连接字符串中设置为MODE=MySQL. 关于它的说法如下:

要使用MySQL模式,请使用数据库URLjdbc:h2:~/test;MODE=MySQL或SQL语句SET MODE MySQL

  • 插入数据时,如果定义了某列NOT NULLNULL插入了该列,则使用 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

  • 在描述中它看起来很棒。根据我的经验,不返工是行不通的 (2认同)