2010-03-16 9 views
6

Estoy usando Phing 's dbdeploy task a manage my database schema. Esto funciona bien, siempre y cuando no haya errores en las consultas de mis archivos delta.Obtención de la tarea dbdeploy de Phing para que se retrotraiga automáticamente en error delta

Sin embargo, si hay un error, dbdeploy sólo ejecutará los archivos delta hasta la consulta con el error y luego abortar. Esto me causa algo de frustración, porque tengo que deshacer manualmente la entrada en la tabla de registro de cambios. Si no lo hago, dbdeploy asumirá que la migración fue exitosa en una prueba posterior, por lo que cualquier reintentos no hará nada.

Entonces, la pregunta es, ¿Hay alguna forma de obtener transacciones de uso de dbdeploy o puede sugerir otra forma de deshacerse automáticamente cuando se produce un error?

Nota: No soy tan competente con Phing, por lo que si esto implica escribir una tarea personalizada, cualquier código de ejemplo o una URL con más información es muy apreciada. Gracias

+0

creo phings dbdeploy en su estado actual es inferior a los proyectos que se concentran en db-versiones solamente. Ver http://stackoverflow.com/questions/3324571/is-there-a-php-equivalent-of-rails-migrations por ejemplo –

Respuesta

3

(si todavía estás ahí fuera ...) En cuanto a Phing para una tarea volcado db, utilizar la utilidad de volcado de la base de datos y crear una tarea phing. Puedo utilizar postgres y sobre todo tener esto en mi build.xml phing:

<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

La forma "correcta" de hacer esto es hacer una copia de seguridad antes de cambiar el esquema, luego retroceder en caso de error.

No dice qué db utiliza, pero me pregunto si todos los cambios de esquema serían compatibles en las transacciones. Las bases de datos de Mos final SQL (Oracle, db2, sql server) no hacen eso en todos los casos por muy buenas razones. Los cambios de esquema Transacitonal son REALMENTE DUROS y REALMENTE intensivos en recursos.

+0

Gracias. Usando MySQL pero estoy considerando usar esto para administrar algunas Vistas en un Oracle 10g también. ¿Alguna idea de cómo hacer la copia de seguridad con Phing? – Gordon

+0

No. No debería hacerse allí. es el trabajo de los administradores realizar una copia de seguridad antes de que se realicen cambios en la configuración o el software. – TomTom

+4

Umm, eso es un poco contrario al propósito de las herramientas de implementación automática como phing, ¿no es así? – Gordon

1

¿Por qué no escribir una serie de deltas de deshacer y agregar una tarea de actualización que se ejecuta al fallar la otra tarea?

+0

Gracias. Tengo deshacer deltas. Pero, ¿cómo podría ejecutarlos automáticamente? ¿Cómo sabría la otra tarea de phing qué tan lejos volver corriendo? – Gordon

+0

en términos de saber cuánto tiempo tardarás en ir, podrías establecer una propiedad para el punto de partida. En cuanto a la ejecución automática, no estoy seguro de que pueda hacerlo automáticamente, pero ¿qué pasa con la configuración de una tarea que verifica la tabla de versiones de db y, en función de eso, ejecuta la operación de deshacer? Es posible que desee ver xinc, que tiene los notificadores para el éxito y el fracaso, con la capacidad de ejecutar cierta lógica de código en función del éxito o el fracaso. –

1

realmente debería echar un vistazo a capistrano. TomTom: le falta algo aquí: la copia de seguridad antes del cambio de esquema, por supuesto, tiene que hacerse, pero ¿qué hacer con los NUEVOS datos que se insertaron mientras pensaba que todo estaba bien? No digo, hay una buena herramienta para este problema, pero el problema existe en la vida real.

+0

Gracias por la sugerencia. Sin embargo, me gustaría permanecer en el ecosistema PHP si es posible. – Gordon

3

La forma más sencilla de resolver su problema es utilizar la tarea pdoexec que por defecto se ejecuta secuencia de comandos SQL en una transacción realizada. Cuando se produce un error del motor de base de datos será deshacer automáticamente los cambios (incluso aquellos en la mesa de registro de cambios - la base de datos estará en el estado anterior)

Ejemplo:

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

¡Excelente! Esto funciona perfectamente – Clint

+0

¿Funciona esto para las declaraciones cambiantes de DDL? Al menos en MySql no se pueden revertir. – Gordon

3

que sé, este es el hilo muy antiguo, pero tal vez será uso completo para otra persona. Puede usar declaraciones try-> catch para implementar una solución para eso. Mi ejemplo:

<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> 
Cuestiones relacionadas