Migration de Schéma/Données
La migration de données et de schéma dans le cadre d'un framework est une tâche difficile dans son implémentation. Il consiste en gros à se souvenir des modifications apportées au schéma (tables, vues, etc) et éventuellement aux données dans le schéma pendant tout le cycle de vie de l'application. Le but étant clairement de gérer la persistance d'attributs inexistants ou supprimés depuis la dernière synchronisation avec le support de persistance (SGBD-R, CouchDB, etc).
Dans l'écosystème Django, South semble le plus aboutit pour la gestion de ce qui est désormais connu sous le vocable de Migration. Parmi les éléments qui font la force de South on peut citer le fait qu'il génère un script de migration en Python très propre et très lisible avec une API Base de données et un ORM par lequel on a accès aux modèles (South a un grand nombre de vote de la communauté pour une intégration à django/contrib éventuelle et nombre de développeurs Django soumettent régulièrement des patchs à South:
from south.db import db
from django.db import models
from core.models import *
class Migration:
def forwards(self, orm):
"Write your forwards migration here"
def backwards(self, orm):
"Write your backwards migration here"
models = {
'monappli.monmodele': {
'unedate': ('models.DateField', ["'Date de Heu'"], {}),
},
'mon.monautremodele': {
'monmodele': ('models.ForeignKey',
["orm['monappli.monmodele']"],
{'related_name': "'boubougolo'"}
),
},
}
complete_apps = ['monappli']
Les méthodes `forwards()` et `backwards()` peut être utilisées pour toute les manipulations de données souhaitées et cela avec l'aide précieuse l'API db. Un très bon exemple est donné dans le tutoriel, il consiste à remplacer un champ nom_complet avec les champs prenoms et noms en copiant les données déjà définit dans le nom_complet:
# Exemple du tutoriel3: http://south.aeracode.org/wiki/Tutorial3
def forwards(self, orm):
db.add_column('monappli_monmodele',
'prenoms',
models.CharField(max_length=150)
)
db.add_column('monappli_monmodele',
'noms',
models.CharField(max_length=150)
)
for item in orm.MonModele.objects.all():
pass # ... Une copie de données par exemple ...
db.delete_column('monappli_monmodele', 'nom_complet')
Il est courant de ne penser à la migration que lorsqu'on a commencé les premiers tests d'une applications après avoir introduit quelques données de test. South permet simplement de mettre en œuvre une migration après coup:
Avec la version >= 0.5:
./manage.py startmigration monappli --initial
./manage.py migrate monappli
Avec les versions antérieures:
./manage.py convert_to_south monappli
South support l'auto-détection de modification lorsque l'application est gélées (dans settings.py):
SOUTH_AUTO_FREEZE_APP = True
En auto-détection il suffit simplement après des modifications dans les modèles de demander l'auto-détection:
python manage.py startmigration monappli nom_migration --auto
Et si les modifications détectées sont correctes alors il suffit de lancer la migration:
python manage.py migrate monappli
Celle-ci se traduira par une série de directives de type DDL sur le support de stockage
de façon agnostique aux support de stockage comme l'ORM de Django lui-même
Pour couronner le tout, South-0.5.2 est disponible dans sid sous le nom
python-django-south
South est relativement bien documenté, vous pouvez suivre le tutoriel qui donne tous les éléments pour être à l'aise avec South. Vous pouvez aussi lire l'article de Andrew Godwin sur les choix d'architecture de South.
Erlang aussi dans le web framework
Avec Nitrogen Erlang est en plein dans la danse. Avec Seaside (Smalltalk), Django (Python) et ses frères, Weblocks (Common Lisp), HApps (Haskell) et Rails (Ruby), c'est une vraie alternative sérieuse qui apporte la force d'Erlang sur la table (remise à l'échelle innée).
Pour le côté bling bling Nitrogen fait un choix qui devient standard de fait: jQuery
Python African Tour (Etape Sénégal)
Nous avons l'honneur d'accueillir la Python African Tour à Dakar du 06 au 10 juillet 2009, si vous voulez aider, participer, ne rien faire, visitez le site de l'évenement