Django : inspection de database et multi db
Je viens de tester 2 fonctionnalités sympa de Django : L’inspection de database et le multi-bases.
L’inpection de database (inspectdb) : permet d’analyser une base de données existante et d’en extraire le models. Le multi database : Capacité de Django à utiliser plusieurs base de données dans une application Pour tester, j’ai fait une extraction de la base de l’outil taskfreak pour utiliser l’ORM de Django et accéder ainsi dans une application aux données de cet outils.
L’idée première était d’extraire des données de taskfreak (outil de suivi de tâches) pour les utiliser dans une application Django de gestion de projet (en cours de réalisation).
1ère étape : configuration de l’accès à la base
Dans le fichier de settings de l’application, ajouter une configuration d’accès à une base :
DATABASES = {
'default': {
'ENGINE' : 'django.db.backends.mysql',
'NAME' : 'pyowprojet',
'USER' : 'pyowprojet',
'PASSWORD' : 'pyowprojet',
'HOST' : 'localhost',
'PORT' : '',
},
'taskfreak' : {
'ENGINE' : 'django.db.backends.mysql',
'NAME' : 'taskfreak',
'USER' : 'taskfreak',
'PASSWORD' : 'taskfreak',
'HOST' : 'localhost',
'PORT' : '',
},
}
Dans cette exemple (en Django 1.3), j’ai une connexion à une base par défaut : pyowprojet et la base taskfreak.
2ème Etape : Création d’une application taskfreak
Là, rien de bien sorcier, il suffit de demander à Django de créer une nouvelle application. Dans le répertoire du projet, lancer :
python manage.py startapp taskfreak
Il y a création d’un répertoire taskfreak. Bien, penser à ajouter dans le fichier de settings de Django cette nouvelle application
3ème étape : Inspection de la base
Là, il suffit de lancer :
python manage.py inspectdb --database=taskfreak
La console sort le model Django de la base. Super, il suffit de le mettre dans notre modèle.
python manage.py inspectdb --database=taskfreak >taskfreak.models.py
Et voilà !!!!
4ème étape : Vérifications
Là, il faut ouvrir le fichier models.py avec un bon éditeur (vim par exemple) et vérifier la cohérence du modèle. Le modèle généré souffre parfois de problèmes comme :
- ordre de déclaration des classes
- non détection des relations … Dans un premier temps, on ne contrôle que l’ordre de déclaration des classe. Pour taskfreak, je n’ai pas eu de problèmes.
5ème étape : Accès aux données avec l’ORM
On se connecte au shell:
python manage.py shell
Et là, quelques exemples :
Accès à un projet
In [1]: from taskfreak.models import *
In [2]: projet=FrkProject.objects.get(projectid=1)
In [3]: print projet
Your first project 2
Accès à une tâches
In [7]: tache=FrkItem.objects.get(itemid=1)
In [8]: print tache
Congratulations! This is your first task
Et après …… Et bien, la suite plus tard (j’ai testé, mais pas rédigé le process):
- Accès aux objets depuis l’interface d’admin : ça marche
- Création d’un routeur d’accès à la base pour faire en sorte que depuis l’admin les modifications de données s’effectuent dans la bonne base
- Mise en place des relations (non détectée dans le schéma de taskfreak) : pour récupérer par exemple, les taches depuis le projets ou l’historique d’une tâches
Reste donc plus qu’à rédiger tout cela.
Conclusion
Après en gros 1 heure de travail sur le sujet, j’ai :
- récupérer le modèle de taskfreak
- Accès aux données depuis l’interface d’admin de Django
- Capacité à modifier les données depuis cette interface
- Affichage des projets dans l’interface d’admin avec les relations en mode inline : les membres du projet, les tâches
- Idem pour les tâches, affichage des changements directement en inline depuis la tâches.
- Et j’ai un peu joué directement dans le shell de Django pour naviguer dans les données via l’ORM.
Le suite sera de passer tout cela dans l’extension django-chartit pour avoir des statistiques et faire un ou 2 dashboard pour django-admin-tools pour avoir uns synthèse des projets suivi dans taskfreak.