57 votes

Comment gérer efficacement les changements de schéma fréquents à l'aide de sqlalchemy?

Je suis à la programmation d'une application web à l'aide de sqlalchemy. Tout a été bon lors de la première phase du développement, alors que le site n'était pas en production. Je pourrais facilement modifier le schéma de base de données par la simple suppression de l'ancienne base de données sqlite et en créer un nouveau à partir de zéro.

Maintenant le site est en production et j'ai besoin de conserver les données, mais je veux encore garder mon original de la vitesse de développement par facilement la conversion de la base de données vers le nouveau schéma.

Donc, disons que j'ai model.py lors de la révision de 50 et model.py une révision 75, décrivant le schéma de la base de données. Entre ces deux schéma de la plupart des changements sont insignifiants, par exemple, une nouvelle colonne est déclarée avec une valeur par défaut et je veux juste ajouter que cette valeur par défaut pour les anciens enregistrements.

Finalement, quelques modifications peuvent ne pas être trivial et nécessite quelques pré-calcul.

Comment faire (ou serait) vous gérer l'évolution rapide des applications web avec, disons, un ou deux nouvelle version de la production de code par jour ?

Par ailleurs, le site est écrit en Pylônes si cela fait une différence.

40voto

Alan Hamlett Points 1041

L'alambic est un nouveau migrations de base de données de l'outil, écrit par l'auteur de SQLAlchemy. Je l'ai trouvé beaucoup plus facile à utiliser que sqlalchemy-migrer. Il fonctionne parfaitement avec Flacon de SQLAlchemy.

Auto générer le schéma script de migration à partir de votre SQLAlchemy modèles:

alembic revision --autogenerate -m "description of changes"

Puis appliquer le nouveau schéma des modifications à votre base de données:

alembic upgrade head

Plus d'infos ici: http://readthedocs.org/docs/alembic/

16voto

S.Lott Points 207588

Ce que nous faisons.

  1. Utiliser "version majeure"."version mineure" l'identification de vos applications. Version est le numéro de version de schéma. Le plus grand nombre n'est pas un hasard "assez nouvelle fonctionnalité" genre de chose. C'est une déclaration formelle de la compatibilité avec le schéma de base de données.

    Version 2.3 et 2.4 à la fois utiliser le schéma de la version 2.

    La version 3.1 utilise la version 3 du schéma.

  2. Faire le schéma de la version très, très visible. Pour SQLite, ce qui signifie garder le numéro de version du schéma de la base de données nom de fichier. Pour MySQL, utilisez le nom de base de données.

  3. Écrire des scripts de migration. 2to3.py, 3to4.py. Ces scripts fonctionnent en deux phases. (1) la Requête de l'ancien données dans la nouvelle structure de création simple CSV ou des fichiers JSON. (2) la Charge de la nouvelle structure de la simple CSV ou des fichiers JSON sans traitement supplémentaire. Ces extraire les fichiers ... parce qu'ils sont dans la bonne structure, sont rapides à charger et peut facilement être utilisé comme unité d'appareils de test. Aussi, vous n'avez jamais deux bases de données ouvertes en même temps. Cela rend les scripts un peu plus simple. Enfin, le chargement de fichiers peuvent être utilisés pour déplacer les données vers un autre serveur de base de données.

C'est très, très difficile "d'automatiser" schéma de migration. Il est facile (et commune) pour avoir une base de données de la chirurgie si profonde, que d'un script automatisé ne peut pas facilement les données de carte de vieux schéma à nouveau schéma.

13voto

nosklo Points 75862

L'utilisation de sqlalchemy-migrer.

Il est conçu pour soutenir une approche agile de conception de base de données, et de faciliter le développement et la production des bases de données de synchronisation, comme les modifications de schéma sont nécessaires. Il rend la version de schéma de facile.

Pensez-y comme une version de contrôle de votre schéma de base de données. Vous vous engagez à chaque changement de schéma, et il sera en mesure d'aller de l'avant/en arrière sur les versions de schéma. De cette façon, vous pouvez mettre à niveau un client, et il permettra de savoir exactement où l'ensemble de modifications à appliquer ce client de base de données.

Il fait ce que S. Lott propose, dans sa réponse, automatiquement pour vous. Fait une chose difficile facile.

0voto

vonPetrushev Points 2149

La meilleure façon de faire face à votre problème est de refléter votre schéma au lieu de le faire de la façon déclarative. J'ai écrit un article à propos de l'approche réflexive ici: http://petrushev.wordpress.com/2010/06/16/reflective-approach-on-sqlalchemy-usage/ mais il y a d'autres ressources à propos de cette également. De cette manière, à chaque fois que vous apportez des modifications à votre schéma, tout ce que vous devez faire est de redémarrer l'application et la réflexion va chercher les nouvelles métadonnées pour les modifications dans les tables. C'est assez rapide et sqlalchemy t-il une seule fois par processus. Bien sûr, vous aurez à gérer les relations les modifications que vous apportez vous-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X