让Phing的dbdeploy任务自动回滚delta错误

时间:2010-03-16 11:27:28

标签: php mysql migration phing dbdeploy

我正在使用Phingdbdeploy taskmanage my database schema。只要我的delta文件的查询中没有错误,这样就可以正常工作。

但是,如果出现错误,dbdeploy将直接运行增量文件到错误的查询,然后中止。这让我有些沮丧,因为我必须手动回滚changelog表中的条目。如果不这样做,dbdeploy将假定在后续尝试中迁移成功,因此任何重试都不会执行任何操作。

所以问题是,有没有办法让dbdeploy使用事务,或者你能否建议在发生错误时自动进行phing回滚

注意:我不熟悉Phing,所以如果这涉及编写自定义任务,那么任何示例代码或带有更多信息的url都会受到高度赞赏。感谢

6 个答案:

答案 0 :(得分:3)

(如果你还在那里......)关于数据库转储任务的phing,请使用db的转储实用程序并创建一个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 :(得分:3)

解决问题的最简单方法是使用pdoexec任务,默认情况下在事务中运行sql脚本。发生错误时,数据库引擎将自动回滚您的更改(即使更改日​​志表上的更改 - 数据库将处于以前的状态)

示例:

<pdosqlexec 
    url="pgsql:host=${db.host}
    dbname=${db.name}"
    userid="${db.user}"
    password="${db.pass}"
    src="${build.dbdeploy.deployfile}"
/>

答案 2 :(得分:3)

我知道,这是一个很老的线程,但也许它会被其他人使用。 您可以使用try-&gt; 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 :(得分:1)

为什么不编写一系列撤消增量并添加一个在其他任务失败时运行的phing任务?

答案 4 :(得分:1)

你真的应该看看capistrano。 TomTom:你在这里缺少一些东西:当然必须在架构改变之前进行备份 - 但是如何处理插入的新数据同时你认为一切正常?我没有说,这个问题有一个很好的工具,但问题存在于现实生活中。

答案 5 :(得分:-1)

执行此操作的“正确”方法是在架构更改之前进行备份,然后在出现错误时进行回滚。

你没有说你使用的是什么数据库 - 但它会想知道在事务中是否支持所有模式更改。 Mos大腿结束SQL数据库(oracle,db2,sql server)在所有情况下都没有这样做,原因很正确。交易模式的变化真的很难,而且真的非常密集。