Получение от Phing задачи dbdeploy для автоматического отката при ошибке дельты - PullRequest
6 голосов
/ 16 марта 2010

Я использую Phing Задача dbdeploy до для управления схемой базы данных . Это работает нормально, пока в запросах моих дельта-файлов нет ошибок.

Однако, если есть ошибка, dbdeploy просто запустит дельта-файлы до запроса с ошибкой и затем прервет работу. Это вызывает у меня некоторое разочарование, потому что я должен вручную откатить запись в таблице изменений. Если я этого не сделаю, dbdeploy предположит, что миграция прошла успешно при следующей попытке, поэтому любые повторные попытки ничего не сделают.

Итак, вопрос в том, есть ли способ получить транзакции использования dbdeploy или вы можете предложить другой способ автоматического отката phing при возникновении ошибки ?

Примечание: Я не настолько искусен в Phing, поэтому, если это включает в себя написание пользовательского задания, любой пример кода или URL с дополнительной информацией высоко ценится. Спасибо

Ответы [ 6 ]

3 голосов
/ 18 мая 2012

Я знаю, это очень старая тема, но, возможно, она будет использоваться полностью для кого-то еще Вы можете использовать операторы try-> catch, чтобы реализовать решение для этого. Мой пример:

<trycatch>
    <try>
        <exec
            command="${progs.mysql} -h${db.live.host} -u${db.live.user} -p${db.live.password} ${db.live.name} &lt; ${db.live.output}/${build.dbdeploy.deployfile}"
            dir="${project.basedir}"
            checkreturn="true" />
            <echo>Live  database was upgraded successfully</echo>
    </try>    
    <catch>
            <echo>Errors in upgrading database</echo>
            <exec
            command="${progs.mysql} -h${db.live.host} -u${db.live.user} -p${db.live.password} ${db.live.name} &lt; ${db.live.output}/${build.dbdeploy.undofile}"
            dir="${project.basedir}"
            checkreturn="true" />
    </catch>
    </trycatch>
3 голосов
/ 31 декабря 2011

Самый простой способ решения вашей проблемы - использовать задачу pdoexec, которая по умолчанию запускает сценарий sql в транзакции.При возникновении ошибки ядро ​​базы данных автоматически откатит ваши изменения (даже те, которые внесены в таблицу журнала изменений - база данных будет в предыдущем состоянии)

Пример:

<pdosqlexec 
    url="pgsql:host=${db.host}
    dbname=${db.name}"
    userid="${db.user}"
    password="${db.pass}"
    src="${build.dbdeploy.deployfile}"
/>
3 голосов
/ 08 апреля 2011

(если вы все еще там ...) Что касается phing для задания дампа db, используйте утилиту db dump и создайте задачу phing. Я в основном использую postgres и у меня это в phing build.xml:

<target name="db-dump" depends="">
    <php expression="date('Ymd-Hi')" returnProperty="phing.dump.ts"/>
    <exec command="pg_dump -h ${db.host} -U ${db.user} -O ${db.name} | gzip > ${db.dumppath}/${db.name}-${phing.dump.ts}.gz" />
</target>
1 голос
/ 29 июня 2010

вы действительно должны взглянуть на Capistrano. TomTom: вы что-то здесь упускаете: необходимо сделать резервную копию перед изменением схемы, но что делать с НОВЫМИ данными, которые были вставлены, пока вы думали, что все в порядке? Я не говорю, что есть хороший инструмент для решения этой проблемы, но проблема существует в реальной жизни.

1 голос
/ 16 марта 2010

Почему бы не написать серию ошибок и отменить добавленную задачу, которая запускается при сбое другой задачи?

0 голосов
/ 16 марта 2010

«Правильный» способ сделать это - сделать резервную копию перед изменением схемы, а затем выполнить откат в случае ошибки.

Вы не говорите, какую базу данных вы используете, но мне было бы интересно, если бы все изменения схемы были поддержаны в транзакциях. В большинстве случаев базы данных SQL (oracle, db2, sql server) не делают этого во всех случаях по очень веским причинам. Трансацитональные изменения схемы ДЕЙСТВИТЕЛЬНО трудны и ДЕЙСТВИТЕЛЬНО интенсивны.

...