2012-10-24 24 views
4

我們在1個月內使用了Flyway,沒有遇到任何問題。Flyway MySQL語法錯誤

但是,今天我試着添加一個很長的遷移腳本(超過1500行),並且遇到了奇怪的MySQL語法錯誤。

我在MySQL Workbench中打開了這個腳本,沒有語法錯誤報告,腳本執行時沒有錯誤。

這個名爲'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服務器版本對應的手冊,以便在'INSERT INTO video_feedback(id,youtube_video_id)VALUES(1102,/ * id * /' 232行[錯誤] com.googlecode' flyway.core.migration.MigrationException:!!移植到10012 版本失敗,請恢復備份和回滾數據庫 和代碼

報道的「INSERT語句LAST」語句錯誤

但如果我在腳本中反轉'INSERT語句LAST'和'INSERT語句LAST-1',e在'INSERT語句LAST-1'(現在在文件末尾)報告了rror。所以我在'INSERT語句LAST'中沒有錯誤,因爲Flyway成功執行了它。另外,如果現在我從腳本'V10012_ insert-acceptance-testing-event-moment-passed.sql'中完全刪除'INSERT語句LAST'語句,並將該語句放入一個名爲'V10013 _test.sql'flyway成功執行我所有的遷移腳本!

那麼,在我最初的'V10012__insert-acceptance-testing-event-moment-passed.sql'腳本中會出現什麼問題呢?

是否有可能的腳本大小限制?

這裏有一些關於我的環境有用信息:

  • 我的腳本中使用大量的/ * * /註釋
  • 遷飛Maven插件1.7
  • Maven的2.0。3
  • 的mysql:mysql的連接器的Java:5.1.21
  • 的MySQL 5.5.X
  • 的Java JDK 1.7.0_09-B05
  • Windows 7的

回答

2

我終於找到了原因的問題。

在我的劇本我:好像

... 
... 

/* 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' 
); 

所以,也許這就是遷飛分析器內的錯誤嗎?

我今天沒有進行測試的時間,但它似乎只有在出現此錯誤:

  • 我們有一個VARCHAR後評論(或其他字符串列類型我想)
  • 這注釋位於')'字符之前

如果一個SQL腳本中存在多個插入語句,則此問題似乎只能重現。

此外,我假定未之前放置的「)」意見是正確的,如:

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

在這裏,在遷飛COMMENT 3和COMMENT 4次,因爲它們被定位後「」和一個字符串值之前,但它們不放在')'字符之前。

希望這可以幫助;-)

+0

我有一個類似的問題。你的評論裏面沒有引號嗎? – Tonin

0

這是非常不可能的,因爲飛路。這幾乎肯定與flyway正在使用的MySQL驅動程序有關。使用MySql本機客戶端,您自然會認爲它可以處理任何合法的語法。即使是'可選'註釋塊

我知道的SURE在MySql的jdbc驅動程序中的一個問題是它無法處理即時分隔符交換。因此觸發器和存儲過程可能會成爲一個問題,特別是如果它們是使用mysqldump生成的,但是隨後您使用Java應用程序重新攝取。

如果你看看here並轉到spring.datasource.separator你會看到這是系統範圍(基本上)設置爲;

現在想象一下,當談到此行的腳本將如何表現:

DELIMITER ;; 
CREATE FUNCTION `int2vancode`(id BIGINT(20)) RETURNS varchar(255) 
BEGIN 
    DECLARE num VARCHAR(10); 
    DECLARE length INT; 
    SET num = conv(id, 10, 36); 
    SET length = char_length(num); 

    return CONCAT(conv(length -1 , 10, 36), num); 
END ;; 
DELIMITER ; 

的Java驅動程序是愚蠢,不解釋任何即使DELIMITER說法顯然是指那些語句客戶端

我現在遇到一個問題,即本地客戶端執行每個腳本時沒有問題,但flyway說我有一個語法錯誤,即使intellij沒有看到。

** **更新

我解決我的問題,它更多或更少的確認,我看到的問題: 我有一個創建表:

CREATE TABLE `Position` (
    PositionID INT NOT NULL AUTO_INCREMENT, 
    `Name` varchar(200) COLLATE utf8_unicode_ci NOT NULL 
); 

我不得不逃離NamePosition for flyway接受它,即使我的bash腳本迭代執行這些都沒有問題。

也許我可以告訴Java驅動程序的東西來幫助它?