代码之家  ›  专栏  ›  技术社区  ›  Gordon Haim Evgi

使Phing的dbdeploy任务在增量错误时自动回滚

  •  6
  • Gordon Haim Evgi  · 技术社区  · 15 年前

    我正在使用 Phing dbdeploy task manage my database schema . 只要我的delta文件的查询中没有错误,就可以正常工作。

    是否有任何方法可以获得dbdeploy use事务,或者您可以建议任何其他方法在发生错误时自动回滚phing ?

    注:

    6 回复  |  直到 15 年前
        1
  •  3
  •   Foot    14 年前

    (如果您还在那里……)关于db dump任务的phing,请使用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>
    
        2
  •  3
  •   Chris Suszyński    13 年前

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

    <pdosqlexec 
        url="pgsql:host=${db.host}
        dbname=${db.name}"
        userid="${db.user}"
        password="${db.pass}"
        src="${build.dbdeploy.deployfile}"
    />
    
        3
  •  3
  •   Алик Нематов    13 年前

    我知道,这是一条很旧的线,但也许它会被其他人完全使用。 您可以使用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>
    
        4
  •  1
  •   Steve Robillard    15 年前

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

        5
  •  1
  •   Aborto Virtuale de la Veritano    14 年前

    你真该看看卡皮斯特拉诺。 TomTom:您在这里遗漏了一些东西:当然必须在模式更改之前进行备份—但是在您认为一切正常的同时,如何处理插入的新数据呢?我不是说有一个很好的工具解决这个问题,但是这个问题存在于现实生活中。

        6
  •  -1
  •   TomTom    15 年前

    实现这一点的“正确”方法是在模式更改之前进行备份,然后在出现错误时回滚。

    你没有说你用什么数据库-但它会怀疑我,如果所有的模式变化将支持事务。大多数高端SQL数据库(oracle、db2、SQL server)并不是在所有情况下都这样做的,原因非常充分。跨城市模式的改变是非常困难的,而且是资源密集型的。