Предварительные условия журнала изменений 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 всегда запускается от начала до конца, поэтому убедитесь, что вы всегда добавляете только что созданные миграции в конец.

Ура! для получения дополнительной информации см. это

Другие вопросы по тегам