35

J'ai une application web utilisant sqlalchemy (dans Pylons). J'ai besoin de changer le schéma de manière efficace pour être capable de changer la version de production au moins quotidiennement, peut-être plus, sans perdre les données.Cela vaut-il la peine d'utiliser sqlalchemy-migrate?

J'ai joué un peu avec sqlalchemy-migrate pendant le week-end et je dirais que ça m'a donné une mauvaise impression. Premier Je pense qu'il ne peut pas aider à la migration entre deux moteurs de bases de données; c'est quelque chose qui pourrait probablement être fait avec sqlalchemy seul. Deuxièmement, les documents ne semblent pas à jour. J'ai dû modifier certaines options de la ligne de commande, comme donner le chemin du référentiel à chaque commande, cela pourrait être un bug de migration.

Mais le pire c'est la commande "manage.py test". Non seulement il modifie réellement la base de données (ce point est clairement indiqué dans la documentation donc je ne peux pas blâmer migrer) mais mon premier script de migration a simplement fait la migration stupide de schema, laissant le DB différent avec un schéma différent de l'original. Mais le « test manage.py » vient de répondre quelque chose comme

success ! 

qui est, il n'a pas vérifié même si le schéma a été laissé dans un état cohérent. Donc, vaut-il la peine d'utiliser migrate? Y at-il un avantage par rapport à la méthode Do It Yourself associée aux bonnes pratiques as proposed by S.Lott? Existe-t-il des alternatives à sqlalchemy-migrate qui simplifient réellement le processus de migration ou suis-je en train d'essayer de migrer avec un priori (alors merci de me montrer pourquoi il est clairement supérieur à la création de colonnes CSV comme proposé dans le lien ci-dessus) ?

Merci beaucoup!

Répondre

54

Utilisation Alambic à la place:

http://pypi.python.org/pypi/alembic

Merci pour les commentaires, sous la direction d'ajouter un raisonnement -

Il est développé par l'auteur de SQLAlchemy, et il est tout neuf et bien pris en charge. Je ne connais pas assez sqlalchemy-migrate pour donner une bonne comparaison. Mais j'ai lu rapidement les docs clairs et concis d'Alembic, puis j'ai effectué ma propre migration autogérée en très peu de temps.Autogeneration: Ce n'est pas son seul mode de fonctionnement, mais si vous le souhaitez, Alembic lira la configuration sqlalchemy de votre application (par exemple, vos classes de modèles déclaratives qui définissent toutes vos tables, contraintes et mappages) et les comparera aux réels l'état actuel de votre base de données et affiche un script Python représentant le delta entre les deux. Vous passez ensuite ce script à la commande de mise à niveau d'Alembic et voilà, les différences sont résolues. Une petite quantité d'édition du script de migration à la main est généralement nécessaire, et c'est (a) juste la nature des migrations, et (b) quelque chose que vous voulez faire pour vous assurer que vous étiez pleinement conscient des étapes exactes de la migration va effectuer avant de l'exécuter. Alembic apporte également une capacité de type DVCS à la façon dont vos migrations sont suivies. Cela rend vraiment facile de revenir à n'importe quel état passé de votre schéma db.

+1

J'ai entendu Alembic pour la première fois, donc j'ai vérifié le lien. Wow, il est écrit par Mike Bayer - l'auteur de SQLAlchemy! Je vais certainement essayer. –

+0

Si vous utilisez Flask, je recommande d'utiliser Alembic avec Flask-Migrate, ce qui rend tout plus facile. http://flask-migrate.readthedocs.org – fnkr

+0

Suivi vos conseils et commuté, et maintenant [j'ai une question] (http://stackoverflow.com/q/27911685/656912). – orome

3

Personnellement, j'aime l'utiliser. C'est génial parce que les nouvelles installations (dev, test, prod) peuvent être amorcées très facilement. Non seulement cela, mais il fournit une maison pour l'application à mesure qu'elle se développe et fournit de bons points d'entrée pour les migrations qui doivent avoir lieu lorsque vous passez de la version à la version de votre application. Quelque chose doit effectuer l'alter/etc sur les serveurs de développement, de test et de production.

Est-ce parfait? Nan. Vous pouvez laisser votre base de données en mauvais état, mais c'est la raison pour laquelle vous avez des versions de dev/testing/production.

Personnellement, je l'utilise pour lancer mes tests unitaires en pylônes en utilisant un sqlite db pour lancer des tests unitaires, mais nous utilisons mysql en production. Donc, il y a quelques avantages de la plateforme cross db de l'utiliser.

7

Alambic être sur (http://pypi.python.org/pypi/alembic) et maintenu par l'auteur SQLAlchemy et compte tenu du fait que le développement sqlalchemy Migrer s'annonce au point mort, avec pratiquement aucun commits cette année (http://code.google.com/p/sqlalchemy-migrate/source/list), je pense que ça ne vaut pas l'utiliser plus, je Je passerai mon projet actuel à Alembic.

S'il était encore très bien entretenu, je serais confiant sur la capacité du projet à rester synchronisé avec SQLAlchemy (ce qui était le cas auparavant).