我正在使用Phing的dbdeploy task到manage my database schema。只要我的delta文件的查询中没有错误,这样就可以正常工作。
但是,如果出现错误,dbdeploy将直接运行增量文件到错误的查询,然后中止。这让我有些沮丧,因为我必须手动回滚changelog表中的条目。如果不这样做,dbdeploy将假定在后续尝试中迁移成功,因此任何重试都不会执行任何操作。
所以问题是,有没有办法让dbdeploy使用事务,或者你能否建议在发生错误时自动进行phing回滚?
注意:我不熟悉Phing,所以如果这涉及编写自定义任务,那么任何示例代码或带有更多信息的url都会受到高度赞赏。感谢
答案 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} < ${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} < ${db.live.output}/${build.dbdeploy.undofile}"
dir="${project.basedir}"
checkreturn="true" />
</catch>
</trycatch>
答案 3 :(得分:1)
为什么不编写一系列撤消增量并添加一个在其他任务失败时运行的phing任务?
答案 4 :(得分:1)
答案 5 :(得分:-1)
执行此操作的“正确”方法是在架构更改之前进行备份,然后在出现错误时进行回滚。
你没有说你使用的是什么数据库 - 但它会想知道在事务中是否支持所有模式更改。 Mos大腿结束SQL数据库(oracle,db2,sql server)在所有情况下都没有这样做,原因很正确。交易模式的变化真的很难,而且真的非常密集。