4

1ヶ月から問題なくFlywayを使用しています。

しかし、今日、私は非常に長い(1500行を超える)新しい移行スクリプトを追加しようとしましたが、奇妙なMySQL構文エラーが発生しました。

このスクリプトをMySQLWorkbenchで開きましたが、報告されている構文エラーはなく、スクリプトはエラーなしで実行されました。

'V10012__insert-acceptance-testing-event-moment-passed.sql'という名前のこのスクリプトには、次の手順が含まれています。

  • INSERTステートメント1
  • INSERTステートメント2
  • ..。
  • INSERTステートメントLAST-1
  • INSERTステートメントLAST

MySQLによって報告されたエラーは次のとおりです。

[エラー]com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorExceptionが原因:SQL構文にエラーがあります。MySQLサーバーのバージョンに対応するマニュアルで、232行目の[ERROR]com.googlecode.flyway.coreの'INSERT INTO video_feedback(id、youtube_video_id)VALUES(1102、/ * id*/'の近くで使用する正しい構文を確認してください。 migration.MigrationException:バージョン10012への移行に失敗しました!バックアップを復元し、データベースとコードをロールバックしてください!

エラーは「INSERTステートメントLAST」ステートメントで報告されます。

しかし、スクリプトで「INSERTステートメントLAST」と「INSERTステートメントLAST-1」を反転すると、エラーは「INSERTステートメントLAST-1」(現在はファイルの最後にあります)で報告されます。したがって、Flywayが正常に実行したため、「INSERTステートメントLAST」にエラーはありません。

また、スクリプト「V10012_insert -acceptance-testing-event-moment-passed.sql」から「INSERTステートメントLAST」ステートメントを完全に削除し、このステートメントを「V10013_test.sql」という名前の新しいファイルに入れると、フライウェイが実行されます。すべての移行スクリプトが正常に実行されました。

それで、私の最初の「V10012__insert-acceptance-testing-event-moment-passed.sql」スクリプトの問題は何でしょうか?

スクリプトサイズの制限はありますか?

これが私の環境に関する有用な情報です:

  • 私のスクリプトはたくさんの/**/コメントを使用しています
  • FlywayMavenプラグイン1.7
  • Maven 2.0.3
  • mysql:mysql-connector-java:5.1.21
  • MySQL 5.5.X
  • Java JDK 1.7.0_09-b05
  • Windows 7
4

2 に答える 2

3

私はついに問題の理由を見つけました。

私のスクリプトでは、次のものがありました:

... 
...

/* INSERT statement LAST - 1 */ 
INSERT INTO `table_1` (`id`, `string_1`, `string_2`)
VALUES (
    1, 
    'aaa',   /* COMMENT 1*/
    'bbb'    /* COMMENT 2*/
);

/* INSERT statement LAST */
INSERT INTO `table_2` (`id`, `string_3`)
VALUES (
    1,       /* COMMENT 3   */
    'cccc'   /* COMMENT 4    */
);

問題は COMMENT 2 と COMMENT 4 にあるようです。テーマ フライウェイを削除すると、すべての移行スクリプトの実行に成功します。

たとえば、次のスクリプトが機能します。

... 
...

/* INSERT statement LAST - 1 */ 
INSERT INTO `table_1` (`id`, `string_1`, `string_2`)
VALUES (
    1, 
    'aaa',   /* COMMENT 1*/
    'bbb'    
);

/* INSERT statement LAST */
INSERT INTO `table_2` (`id`, `string_3`)
VALUES (
    1,   /* COMMENT 3   */
    'cccc'   
);

では、おそらくこれは Flyway パーサー内のバグでしょうか?

今日はテストする時間がありませんが、このエラーは次の場合にのみ発生するようです:

  • VARCHAR (または私が推測する他の文字列型) の後にコメントがあります。
  • このコメントは「)」文字の直前に配置されます

この問題は、1 つの SQL スクリプトに複数の挿入ステートメントが存在する場合にのみ再現可能と思われます。

また、「)」の前に配置されていないコメントは正しいと思います。

/* INSERT statement LAST */
INSERT INTO `table_2` (`id`, `string_3`)
VALUES (
    1,   /* COMMENT 3   */
    'cccc',  /* COMMENT 4   */
    'dddd'
);

ここで、COMMENT 3 と COMMENT 4 は、',' の後、文字列値の前に配置されていますが、')' 文字の前に配置されていないため、Flyway で渡されます。

これが役立つことを願っています;-)

于 2012-10-24T15:17:58.590 に答える