2016-07-29 31 views
3

私は現在データベースとしてmysqlを使用しており、データベーススキーマを管理するためにflywayを使用しています。私のすべてのユニットテストはmysqlに対して実行されており、単体テストを追加すると実際には遅いです。今私はユニットテストでデータベースをmysqlからh2メモリデータベースに変更したいと思います。以下は、H2データベースの接続のための私の設定です:mysqlデータベーススキーマを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 

私はflywayMigrateを実行すると、私はいくつかのSQLエラーを得ました。以下は1つの例ですが、この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] 

EDIT

私はMySQLで罰金を実行しているSQLスクリプトの数百を持っています。だから私はこれらのスクリプトで何かを変更したくない。 h2がmysqlスクリプトを受け入れる方法はありますか?

+0

';を置換または削除します。または、http://topnew.net/siduテーブルのdescをクリックして、テーブル作成前のSQLをコピーしてください。不要な場合はなし – SIDU

+0

すべてを削除しようとしましたが、 'SQLで構文エラーが発生しました'というエラーが発生しました。私は何百ものSQLスクリプトを持っています。私は本当にそれらを1つずつ変更したくありません。これらのSQLはすべてmysqlでうまく動作します。ですから、これらの構文を受け入れるようにh2 dbを設定する方法があるかどうかはわかりません。 –

答えて

1

thisの説明によると、接続文字列にMODE=MySQLと設定して、H2互換性モードでH2データベースを使用することができます。ここではそれについて言われているまさにです:

データベースURL jdbc:h2:~/test;MODE=MySQLまたはSQL文SET MODE MySQLを使用して、MySQLのモードを使用するには。

  • カラムをNOT NULLNULL次いで、0(または空の文字列、またはタイムスタンプ列の現在のタイムスタンプ)が挿入されている値が使用されることが定義されている場合、データを挿入します。通常、この操作は許可されず、例外がスローされます。

  • CREATE TABLEステートメントでインデックスを作成するには、INDEX(..)またはKEY(..)を使用できます。例:create table test(id int primary key, name varchar(255), key idx_name(name));

  • メタデータコールは識別子を小文字で返します。

  • 浮動小数点数を整数に変換するとき、小数点は切り捨てられませんが、値は四捨五入されます。

  • NULLを別の値と連結すると、別の値になります。 H2で、それは(ほとんどの他のデータベースのように)大文字と小文字が区別される一方、MySQLで

テキスト比較は、デフォルトでは大文字と小文字を区別しません。 H2は大文字と小文字を区別しないテキスト比較をサポートしていますが、別途設定する必要があります(SET IGNORECASE TRUEを使用)。これは、=,LIKE,REGEXPを使用した比較に影響します。

+0

説明では、それは素晴らしいようです。私の経験によると、再加工なしでは動作しません –

1

あなたの問題はあなたの例

CREATE TABLE `file_storage` 
(
    'id` BIGINT(64) NOT NULL AUTO_INCREMENT, 
    `file_name` VARCHAR(45) NULL, 
    PRIMARY KEY (`id`) 
) 
DEFAULT CHARACTER SET = utf8; 

「デフォルトの文字セット= UTF8」最後の行は、MySQLのテーブルのオプションを設定していると見ることができます。H2は、常にUnicodeを使用して動作するので、テーブルまたはスキーマレベルでこのようなオプションはありません。

何年にもわたってMySQL用に書かれたSQL DDLステートメントがたくさんある場合は、このような問題が多く発生する可能性があります。

関連する問題