Liquibase выдает ошибку, когда yaml-файл, содержащий SQL, содержит точки с запятой - PullRequest
0 голосов
/ 01 ноября 2018

Я использую Liquibase для обновления некоторых таблиц, и мне кажется, что я сталкиваюсь с ошибкой, что всякий раз, когда в моем .yaml файле есть ;, он выдает ошибку (помещается только в части, так как он просто повторяется то же сообщение об ошибке):

SEVERE 1/11/18 11:39: liquibase: _master.xml: Таблицы / Team / Team.updateTeamNames.yaml :: 1 :: mayj4: Ch ange Установить таблицы / Team / Team.updateTeamNames.yaml :: 1 :: mayj4 не удалось. Ошибка: у вас есть ошибка в вашем S Синтаксис QL; проверьте правильность синтаксиса для руководства, соответствующего версии вашего сервера MySQL. e рядом с «ОБНОВЛЕНИЕ команды SET Name =» B «WHERE Name =« Y »; ОБНОВЛЕНИЕ Команда SET Name = 'C' WHERE Name 'в строке 1 [Ошибка SQL: команда UPDATE SET Name = 'A' WHERE Name = 'X'; ОБНОВЛЕНИЕ Команда SET Name = 'B' WHERE Name = 'Y'; ОБНОВЛЕНИЕ Команда SET Name = 'C' WHERE Name = 'Z'] liquibase.exception.DatabaseException: у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, что с или соответствует вашей версии сервера MySQL для правильного синтаксиса для использования рядом с 'UPDATE Team SET Name =' B ' ГДЕ Имя = 'Y'; UPDATE Team SET Name = 'C' WHERE Name 'в строке 1 [Ошибка SQL: UPDATE Team SET Name = 'A' ГДЕ Имя = 'X'; ОБНОВЛЕНИЕ Команда SET Name = 'B' WHERE Name = 'Y'; ОБНОВЛЕНИЕ Команда SET Name = 'C' ГДЕ N ame = 'Z']

Я также использую эту команду:

liquibase --driver = com.mysql.cj.jdbc.Driver --classpath = C: \ mysql-connector-java-8.0.13 --logLevel = суровый --changeLogFile = _master.xml --url = " jdbc: mysql: // localhost: 3306 / resource? useSSL = false & allowPublicKeyRetrieval = true "--username = root --password = badpassword123 update

Вот файл .yaml с полным SQL.

---
databaseChangeLog:
- changeSet:
    author: mayj4
    id: 1
    changes:
        - sql:
            sql: 
                UPDATE Team SET Name = 'A' WHERE Name = 'X';
                UPDATE Team SET Name ='B' WHERE Name ='Y';
                UPDATE Team SET Name ='C' WHERE Name ='Z';

Что я использую

  • Liquibase 3.6.2
  • MySQL Connector Java 8.0.13
  • MySQL Workbench & Server 8.0.13

Я пытался добавить splitStatements: true к .yaml, но это не имеет значения, как предлагает документация Liquibase .

Обновление 1 Кажется, что даже при удалении точки с запятой все равно происходит сбой, так что это можно сделать при выполнении нескольких запросов.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы можете попробовать использовать '> ' для объединения нескольких операторов SQL в один исполняемый оператор.

- changeSet:
  author: Bob
  id: 1
  changes:
    - sql:
        comment: DML statements to rectify previously added names
        dbms: mysql
        sql: >
            UPDATE Team SET Name = 'A' WHERE Name = 'X';
            UPDATE Team SET Name ='B' WHERE Name ='Y';
            UPDATE Team SET Name ='C' WHERE Name ='Z';
0 голосов
/ 01 ноября 2018

Может быть, что-то вроде этого:

         - UPDATE Team SET Name = 'Maria' WHERE Name = 'Samurai';
         - UPDATE Team SET Name ='Ray' WHERE Name ='Knights';
         - UPDATE Team SET Name ='Stephen' WHERE Name ='Vikings';

или

   - sql:
        sql: 
             sql1
   - sql: 
        sql:
             sql2

и т. Д.

тире - указывает, что запись является частью последовательности, и, поскольку вы хотите выполнить последовательность SQL, это должно помочь. (Вы можете попробовать некоторые варианты, но синтаксис - - это путь.) Лично ваш синтаксис выглядит странно (например, почему я должен вкладывать sql в sql), но я не expers, поскольку я не использую liquidbase с конфигурацией yml.

...