Question

J'utilise Phing de tâche dbdeploy gérer mon schéma de base de données . Cela fonctionne très bien, tant qu'il n'y a pas d'erreurs dans les requêtes de mes fichiers delta.

Cependant, s'il y a une erreur, dbdeploy suffit d'exécuter les fichiers delta jusqu'à la requête avec l'erreur puis abort. Cela me provoque une certaine frustration, parce que je dois rollback manuellement l'entrée dans la table de changelog alors. Si je ne le fais pas, dbdeploy supposera la migration a réussi un essai ultérieur, de sorte que toute retries ne fera rien.

La question est donc, est-il possible d'obtenir des opérations d'utilisation de dbdeploy ou pouvez-vous suggérer une autre façon d'avoir rollback phing automatiquement lorsqu'une erreur se produit ?

Note: Je ne suis pas compétent avec Phing, donc si cela implique d'écrire une tâche personnalisée, tout code exemple ou une URL avec des informations supplémentaires sont très appréciés. Merci

Était-ce utile?

La solution

(si vous êtes toujours là ...) En ce qui concerne phing pour une tâche de vidage db, utilisez l'utilitaire de vidage de la db et créer une tâche de phing. J'utiliser postgres principalement et ceci dans ma 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>

Autres conseils

La façon la plus simple de résoudre votre problème est d'utiliser la tâche pdoexec qui, par défaut exécute le script SQL dans la transaction. Lorsque l'erreur se produit le moteur de base de données rollback automatiquement vos modifications (même ceux sur la table du journal des modifications - base de données sera à l'état précédent)

Exemple:

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

Je sais, ce qui est très vieux fil, mais ce sera peut-être utiliser pleinement pour quelqu'un d'autre. Vous pouvez utiliser répar-> déclarations de prises pour mettre en œuvre une solution pour cela. Mon exemple:

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

Pourquoi ne pas écrire une série de deltas undo et ajouter une tâche de phing qui fonctionne en cas d'échec de l'autre tâche?

vous devriez vraiment jeter un oeil à Capistrano. TomTom: il vous manque quelque chose: la sauvegarde avant le changement de schéma de cours doit être fait - mais ce qu'il faut faire avec les nouvelles données qui a été insérée quant à lui que vous pensiez que tout est ok? Je ne dis pas, tthat il y a un bon outil pour ce problème, mais le problème existe dans la vie réelle.

La façon de le faire est une sauvegarde « appropriée » avant le changement de schéma, puis rollback en cas d'erreur.

Vous ne dites ce que vous utilisez db - mais il me demande si tous les changements de schéma seraient pris en charge dans les transactions. Mos fin de la cuisse bases de données SQL (Oracle, DB2, SQL Server) ne le faites pas dans tous les cas pour de très bonnes raisons. les modifications du schéma Transacitonal sont vraiment difficiles et vraiment Resouce intensive.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top