Предварительные условия журнала изменений Grails ничего не делают
Я пытаюсь внести изменения в базу данных, используя журнал изменений. Поскольку я не могу гарантировать, что значения в настоящее время существуют для конкретного кода, но могут существовать, мне нужно иметь возможность проверить их, чтобы выполнить вставку или обновление.
Вот то, что я тестировал, который, похоже, ничего не делает. Любые слова совета приветствуются.
databaseChangeLog = {
changeSet(author:'kmert', id:'tubecap-insert-update-1') {
preConditions(onFail="WARN",onFailMessage:"Tube cap does not exist,skipping because it cannot be updated."){
sqlCheck(expectedResult='1', 'SELECT * FROM [ltc2_tube_cap] WHERE code=11')
}
grailsChange {
change {
sql.execute("""
UPDATE [ltc2_tube_cap]
SET [name] = 'White'
WHERE [code] = 11;
""")
}
rollback {
}
}
}
}
ОБНОВЛЕНИЕ: у меня запущен скрипт changelog, но теперь я получаю эту ошибку. Я нашел код из онлайн-источника. Я не могу найти много документации по предварительным условиям...
| Запуск dbm-обновления для базы данных hapi_app_user @ jdbc:jtds:sqlserver://localhost;databaseName=LabTraffic;MVCC=TRUE;LOCK_TIMEOUT=10000 проблема синтаксического анализа TubeCapUpdate.groovy: нет сигнатуры метода: grails.plugin.databasemigration.sb ()) применимо для типов аргументов: (java.lang.String, java.lang.String) значения: [1, SELECT * FROM ltc2_tube_cap WHERE code=11] (перезапустите с --verbose, чтобы увидеть трассировку стека) проблема при разборе журнала изменений.groovy: нет сигнатуры метода: grails.plugin.databasemigration.DslBuilder.sqlCheck() применим для типов аргументов: значения (java.lang.String, java.lang.String): [1, SELECT * FROM ltc2_tube_cap WHERE code=11] (перезапустите с --verbose, чтобы увидеть трассировку стека) groovy.lang.MissingMethodException: нет сигнатуры метода: grails.plugin.databasemigration.DslBuilder.sqlCheck() применим для типов аргументов: (java.lang.String, java.lang.String) значения: [1, SELECT * FROM ltc2_tube_cap WHERE code = 11] в grails.plugin.databasemigration.DslBuilder.invokeMethod(DslBuilder.groovy:117) в сценарии Script1) at grails.plugin.databasemigration.DslBuilder.invokeMethod(DslBuilder.groovy:117) в сценарии 1.plugin. grails.plugin.databasemigration.DslBuilder.invokeMethod (DslBuilder.groovy: 117) в скрипте 1.update(Liquibase.java:107) т DbmUpdate$_run_closure1_closure2.doCall(DbmUpdate:26) при _DatabaseMigrationCommon_groovy$_run_closure2_closure11.doCall(_DatabaseMigrationCommon_groovy:59) в grails.plugin.databasemigration.MigrationUtils.executeInSession(MigrationUtils.groovy:133) в _DatabaseMigrationCommon_groovy$_run_closure2.doCall(_DatabaseMigrationCommon_groovy:51) на DbmUpdate$_run_closure1.doCall(DbmUpdate:25)
2 ответа
Ваш синтаксис неверен для предусловия sqlCheck.
sqlCheck(expectedResult:'1', 'SELECT * FROM [ltc2_tube_cap] WHERE code=11')
Обратите внимание, что в вашем коде первый аргумент является оператором присваивания expectedResult=1
и это должна быть запись на карте expectedResult:1
,
Я нашел ответ, похороненный на этой странице Jira. https://jira.grails.org/browse/GPDATABASEMIGRATION-40 который по иронии судьбы заключается в добавлении большого количества примеров к DSL переноса БД в документацию.
Убедитесь, что следующее
grails dbm-gorm-diff add-your-file-forupdate.groovy -add
тогда внутри your-file-forupdate.groovy ожидается увидеть
databaseChangeLog = {
changeSet(author:'kmert', id:'tubecap-insert-update-1') {
.
.
.
}
}
Тогда самое главное, если вы включили это как файл сценария миграции, который будет выполняться следующим образом:
просто вручную добавьте следующую строку в конец grails-app / migrations / changelog.groovy:
включаемый файл: 'your-file-forupdate.groovy'
Changelog.groovy всегда запускается от начала до конца, поэтому убедитесь, что вы всегда добавляете только что созданные миграции в конец.
Ура! для получения дополнительной информации см. это