2017-06-07 1 views
0

Je travaille sur une migration de parcours qui écrira le contenu d'une table en tant que chaîne JSON dans un champ d'une autre table. J'essaie de me débarrasser d'environ 50 de ces tables et de les remplacer par des champs contenant des chaînes JSON. Le problème que j'ai est que la requête fonctionne bien quand je l'exécute dans MySQL Workbench, mais elle échoue quand j'exécute la migration de la voie de migration. J'ai essayé de modifier la requête. L'exécution d'une procédure stockée très simple fonctionne. L'exécution d'un select sur INFORMATION_SCHEMA.COLUMNS fonctionne également bien. J'ai essayé d'écrire la requête en utilisant SET @qry: =() et cela ne fait aucune différence. J'apprécierais n'importe quelle idée sur comment résoudre ceci.La migration de l'itinéraire échoue bien que le script s'exécute correctement dans le client DB (MySQL)

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 

C'est la requête

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; 
+0

On dirait que MySQLSyntaxErrorException sort du pilote MySQL, ce qui vaut la peine d'éliminer Flyway de l'équation. Vous pouvez essayer de créer un [JavaMigration] (https://flywaydb.org/documentation/migration/java) qui vous fournit une connexion à la base de données et exécutez la requête pour déterminer si le pilote est capable d'exécuter cette requête mot pour mot. – markdsievers

Répondre

0

Ceci est certainement dû à notre analyseur de trébucher sur les nombreuses combinaisons de citations. S'il vous plaît déposer un problème dans le suivi des problèmes et inclure la forme la plus simple de la requête qui casse.