0

mysql-applicationをテストするためにh2を埋め込もうとしています(統合テスト)

mavenを介してcom.h2database:h2:1.3.170を追加し、次のコードを実行します。

public class InMemoryTest
{
    @Test
    public void test() throws Exception {
      Class.forName("org.h2.Driver");

      Connection conn = DriverManager.
          getConnection("jdbc:h2:mem:test;MODE=MySQL;IGNORECASE=TRUE;INIT=RUNSCRIPT FROM 'src/test/resources/test.sql'");
    }
}

これにより、次の例外が発生します。

Syntax error in SQL statement "
CREATE TABLE IF NOT EXISTS ""usr_avatar"" (
  ""usr_avatar_id"" INT(11) NOT NULL AUTO_INCREMENT,
  ""usr_avatar_user_id"" INT(11) NOT NULL,
  ""usr_avatar_img"" BLOB NOT NULL,
  PRIMARY KEY (""usr_avatar_id""),
  UNIQUE KEY ""usr_avatar_id_UNIQUE"" (""usr_avatar_id""),
  UNIQUE KEY ""usr_avatar_user_id_UNIQUE"" (""usr_avatar_user_id""),
  KEY ""usr_user_id"" (""usr_avatar_user_id""),
  KEY ""fk_user_id"" (""usr_avatar_user_id"")
) AUTO_INCREMENT[*]=1  ";

どうやら、「AUTO_INCREMENT」はこれを引き起こしますか?

これは有効なMySQLであるため(MySQL Workbenchを使用して実際のデータベースからダンプをエクスポートしました)、h2がMySQLをサポートすると主張しているため、少し混乱していますか?.sqlからの数行は次のとおりです。

DROP TABLE IF EXISTS `usr_avatar`;
CREATE TABLE IF NOT EXISTS "usr_avatar" (
  "usr_avatar_id" int(11) NOT NULL AUTO_INCREMENT,
  "usr_avatar_user_id" int(11) NOT NULL,
  "usr_avatar_img" blob NOT NULL,
  PRIMARY KEY ("usr_avatar_id"),
  UNIQUE KEY "usr_avatar_id_UNIQUE" ("usr_avatar_id"),
  UNIQUE KEY "usr_avatar_user_id_UNIQUE" ("usr_avatar_user_id"),
  KEY "usr_user_id" ("usr_avatar_user_id"),
  KEY "fk_user_id" ("usr_avatar_user_id")
) AUTO_INCREMENT=1 ;

DROP TABLE IF EXISTS `usr_restriction`;
CREATE TABLE IF NOT EXISTS "usr_restriction" (
  "usr_restriction_id" int(11) NOT NULL AUTO_INCREMENT,
  "usr_restriction_user_id" int(11) DEFAULT NULL,
  "usr_restriction_ip" varchar(39) DEFAULT NULL,
  "usr_restriction_valid_from" date NOT NULL,
  "usr_restriction_valid_to" date DEFAULT NULL,
  PRIMARY KEY ("usr_restriction_id"),
  UNIQUE KEY "usr_restriction_id_UNIQUE" ("usr_restriction_id"),
  KEY "user_id" ("usr_restriction_user_id"),
  KEY "usr_user_id" ("usr_restriction_user_id")
) AUTO_INCREMENT=1 ;

私のオプションは何ですか?別のソフトウェアでダンプをエクスポートし、それをプレーンSQLにする必要がありますか?どのソフトウェアがそれを行うことができますか?それとも私は何か間違ったことをしていますか?

4

3 に答える 3

3

AUTO_INCREMENT=1問題は、H2 がSQL ステートメントで指定した をサポートしていないことです。削除してみてください。MySQLにも必要ないと思います。

于 2013-01-25T05:33:03.397 に答える
2

MySQLからエクスポートされたソースSQLには、リテラルを囲む二重引用符があります。最初のDROPステートメントにも「バックティック」( `)があります。しかし、H2がエラーを報告しているとき、H2は二重二重引用符で囲まれたリテラルを表示しています。これが問題だと思います。

いくつか試してみてください。まず、DROPステートメントのバックティックを取り、一重引用符に変換します。それでも問題が解決しない場合は、すべての二重引用符を一重引用符に変換します。それでも問題が解決しない場合は、すべての引用符を削除してください。

H2は、実際のテーブル名/列名の一部として二重引用符を使用してテーブルを作成しようとしていると思います。これにより、爆弾が発生します。

于 2013-01-24T20:15:37.840 に答える
2

H2 はサポートしていませんAUTO_INCREMENT=1

代わりにこれを使用してください:

ALTER TABLE table_name ALTER COLUMN id RESTART WITH 1;
于 2016-06-17T13:11:33.310 に答える