0
私は、あるテーブルの内容を別のテーブルのフィールドにJSON文字列として書き込むマイグレーションを進めています。これらのテーブルのうち約50個を取り除き、JSON文字列を含むフィールドに置き換えようとしています。DBクライアント(MySQL)でスクリプトが正常に実行されても、移動経路の移動に失敗する
問題は、MySQL Workbenchでクエリを実行したときに問題なく実行されますが、フライウェイ移行を実行すると失敗します。私は、クエリを変更しようとしました。非常に単純なストアドプロシージャを実行すると動作します。 INFORMATION_SCHEMA.COLUMNSのselectを実行することもOKです。私はSET @ qry:=()を使ってクエリを書こうとしましたが、違いはありません。私はこれを解決する方法についての任意のアイデアを感謝したいと思います。
MySQLSyntaxErrorException: You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version
for the right syntax to use near 'PREPARE stmt FROM @qry;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- =========' at line 13
これはこれは、引用符の多くの組み合わせにつまずくほぼ確実に私たちのパーサーが原因で、クエリ
SET GLOBAL group_concat_max_len = (10*1024);
SET GLOBAL max_allowed_packet = (50*1024*1024);
SET @schema = 'db';
SET @table = 'InterfaceTable';
SET @className = 'TestInterfaceConfing';
SET @interfaceType = 'Test';
SELECT CONCAT(
'UPDATE TestTable as tt SET interfaceConfig=(SELECT CONCAT(TRIM(TRAILING ', QUOTE(','),
' FROM CONCAT(', QUOTE('{"@class":"'), ',', QUOTE(@className), ',', QUOTE('",'), ',',
GROUP_CONCAT(QUOTE('"'), ',', QUOTE(COLUMN_NAME), ',', QUOTE('"'), ',', QUOTE(':'), ',',
IF(type like '%CHAR', '\'"\',', ''), 'IF(', COLUMN_NAME, ' is null,', IF(type like '%CHAR', '\'\'', QUOTE('null')) , ',', COLUMN_NAME, ')', IF(type like '%CHAR', ',\'"\'', ''), ',', QUOTE(',')),
')), ''}'') FROM ', @table, ' as interface WHERE tt.id=interface.id) where tt.interfaceType=', QUOTE(@interfaceType), ';'
)
INTO @qry
FROM
(SELECT COLUMN_NAME, DATA_TYPE as type FROM INFORMATION_SCHEMA.COLUMNS c
WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = @table) t;
PREPARE stmt FROM @qry;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
MySQLのドライバから「MySQLSyntaxErrorException」が出てくるので、Flywayを除外する価値があります。 [JavaMigration](https://flywaydb.org/documentation/migration/java)を作成して、データベースへの接続を提供し、クエリを実行して、ドライバがそのクエリをそのまま実行できるかどうかを判断することもできます。 – markdsievers