ARCHIVE ATELIER DJANGO INSPECTDB MODELES
1 [12:33:38] <arnaud.amelina@auf.org> ====================== Debut ATELIER DJANGO INSPECTDB MODELES ... =====================
2 [12:33:47] <olivier.larcheveque> bonjour!
3 [12:34:39] <olivier.larcheveque> Cet atelier couvre un autre aspect qu'on retrouve dans les projets à savoir la communication avec un SGBD
4 [12:35:20] <olivier.larcheveque> et l'écosystème Django apporte son lot de choses intéressantes pour nous en faciliter la tâche
5 [12:35:25] franck.kouyami quitte le salon
6 [12:36:30] <olivier.larcheveque> Déjà quelques mots pour expliquer le titre de l'atelier:
7 [12:36:58] <olivier.larcheveque> InspectDb ca se devine, c'est pour inspecter les bases de données ;)
8 [12:37:55] <olivier.larcheveque> une fois un connecteur de BD déclaré dans django, on peut utiliser une commande pour examiner les tables et produire une classe Python pour la manipuler
9 [12:38:24] <olivier.larcheveque> Quant à South, c'est plus dur à deviner hein?
10 [12:38:37] <olivier.larcheveque> c'est en fait un framework de migration.
11 [12:39:07] <olivier.larcheveque> c'est un concept commun qu'on ne retrouve pas seulement dans Django
12 [12:40:02] <olivier.larcheveque> Concrêtement, ça sert à faciliter les évolutions (niveau bd) d'un projet
13 [12:41:31] <olivier.larcheveque> en gros, south fournit un moyen de créer des scripts de migrations pour changer la structure, importer des données, bouger des donnée....
14 [12:42:08] <olivier.larcheveque> il conserve un historique de tout ce qui a été appliquer à la base de donnée, dans quel contexte
15 [12:43:22] <olivier.larcheveque> Il prend en "photo" l'état de la base de donnée, pour se projeter dans l'état final que vous avez codé
16 [12:43:48] <olivier.larcheveque> c'est vraiment un composant très important
17 [12:44:18] <olivier.larcheveque> fini les petits scripts sql à rouler à la main on ne sait plus trop quand ;)
18 [12:44:45] <olivier.larcheveque> questions sur la présentation des composants?
19 [12:47:19] ange.rakotomalala quitte le salon
20 [12:47:35] <olivier.larcheveque> ok on procède à l'installation de l'environnement
21 [12:47:45] <olivier.larcheveque> normalement une grande partie est déjà faite
22 [12:47:47] pascal.bou-nassar quitte le salon
23 [12:48:09] <olivier.larcheveque> tout le monde a déjà réactivé son environnement "atelier" ?
24 [12:49:09] <davin.baragiotta> oui
25 [12:49:18] <olivier.larcheveque> pour ceux qui sont déjà repartis
26 [12:49:35] <olivier.larcheveque> il faut installer le package qui permet de communiquer avec une bd MySQL
27 [12:49:49] <olivier.larcheveque> on va l'installer côté système
28 [12:50:57] <olivier.larcheveque> bon je ne l'ai pas mis dans la page Wiki
29 [12:51:49] <progfou> sudo apt-get install python-mysqldb
30 [12:52:05] <olivier.larcheveque> bon super merci
31 [12:52:10] <olivier.larcheveque> je cherchais ça ;)
32 [12:52:24] <olivier.larcheveque> on peut tester :
33 [12:52:28] <olivier.larcheveque> python -c "import MySQLdb"
34 [12:52:47] <olivier.larcheveque> avec l'environnemnent d'activé bien sûr
35 [12:53:22] <olivier.larcheveque> est-ce que tout le monde à préparer sa base de donnée avec le jeu de données FOAD?
36 [12:53:45] kader rejoint le salon
37 [12:53:50] <davin.baragiotta> wiki à jour : https://wiki.auf.org/wikiteki/Projet/SemaineTech/2013/Ateliers/DjangoInspectdbSouth
38 [12:55:07] arnaud.amelina quitte le salon
39 [12:56:19] kazuhiro.oguchi rejoint le salon
40 [13:01:53] <olivier.larcheveque> ok donc tout le monde a à peut près son paquet MySQL qui marche
41 [13:02:02] <olivier.larcheveque> les données de FOAD en BD
42 [13:02:16] <olivier.larcheveque> on commence à préparer un projet Django
43 [13:02:37] <olivier.larcheveque> on poursuit
44 [13:02:44] <olivier.larcheveque> sur la page
45 [13:02:46] <olivier.larcheveque> https://wiki.auf.org/wikiteki/Projet/SemaineTech/2013/Ateliers/DjangoInspectdbSouth/Support
46 [13:02:52] darko.stanar rejoint le salon
47 [13:04:04] <olivier.larcheveque> ok on commence À créer le nouveau projet Django
48 [13:05:04] <olivier.larcheveque> django-admin.py startproject foad
49 [13:05:15] <olivier.larcheveque> (j'avais fait une faute sur le wiki)
50 [13:06:19] <olivier.larcheveque> ok vous pouvez suivre la partie boostrap
51 [13:06:40] <olivier.larcheveque> au final vous pouvez lancer le serveur Django
52 [13:07:07] <olivier.larcheveque> bien sûr, si vous testez une réponse, ça ne marchera pas on a rien programmer encore
53 [13:07:16] <olivier.larcheveque> on s'assure juste que ça run bien
54 [13:07:29] <olivier.larcheveque> ok jusqu'ici?
55 [13:11:49] <olivier.larcheveque> donc le but du projet, c'est de prendre les données d'un système, et de les utiliser pour bâtir un nouveau système
56 [13:11:59] <davin.baragiotta> ok, continue
57 [13:12:07] <olivier.larcheveque> un système avec une structuration différente des données
58 [13:13:02] <olivier.larcheveque> on poursuit ave la partie "Base de données MySQL"
59 [13:13:32] <olivier.larcheveque> on va créer une nouvelle base de donnée "atelier" qui sera la cible de notre nouveau projet Django
60 [13:15:02] <olivier.larcheveque> On va procéder à l'activation de l'admin, vous l'avez vu avec l'atelier backend de Davin
61 [13:17:18] <olivier.larcheveque> donc au final de cette partie, on peut se connecter à l'admin : http://127.0.0.1:8000/admin/
62 [13:17:30] <olivier.larcheveque> j'attends ce checkpoint
63 [13:18:03] <olivier.larcheveque> (le petit icone tete rouge en colère, ça vous fournit le code source qui marche si vous avez de la difficulté)
64 [13:18:39] <olivier.larcheveque> tout va bien?
65 [13:20:31] Tri quitte le salon
66 [13:20:45] <davin.baragiotta> Q . Au niveau de setting.py, c'est DATABASE_ENGINE = 'default' ou bien ?
67 [13:22:03] <olivier.larcheveque> R: oui en fait l'entrée 'default' pointe vers notre projet
68 [13:22:12] <olivier.larcheveque> mais on va communiquer par la suite, avec une autre base de données
69 [13:22:16] <olivier.larcheveque> on va lui donner une autre clef dans ce dictionnaire
70 [13:22:22] <olivier.larcheveque> c'est la partie juste après
71 [13:22:35] <olivier.larcheveque> ok je poursuis
72 [13:22:54] <olivier.larcheveque> on va justement commencer à se servir de notre bd 'foad'
73 [13:23:15] <olivier.larcheveque> pour cela on commence par créer une nouvelle application django dans notre projet
74 [13:23:31] eric.mcsween rejoint le salon
75 [13:24:17] <olivier.larcheveque> django-admin.py startapp ancien
76 [13:26:00] <olivier.larcheveque> on va ensuite caler cette nouvelle app dans notre projet
77 [13:26:08] <olivier.larcheveque> dans foad/settings.py
78 [13:26:43] <olivier.larcheveque> on va l'ajouter dans INSTALLED_APPS
79 [13:27:12] <olivier.larcheveque> et nous allons déclarer un nouveau pointeur de bd que l'on nomme 'consultation-ancien'
80 [13:27:35] <olivier.larcheveque> (on peut faire un copier / coller de la partie 'default' de DATABASES)
81 [13:28:08] <olivier.larcheveque> on va ensuite vérifier que notre pointeur marche bien avec la commande :
82 [13:29:42] <olivier.larcheveque> python manage.py inspectdb --database=consultation-ancien
83 [13:30:10] <olivier.larcheveque> vous devriez avoir des modèles Django affichés dans votre terminal
84 [13:30:20] <olivier.larcheveque> ok?
85 [13:31:04] <olivier.larcheveque> la toute la base de données à été scannée, et des modèles Django on été générés pour chaque table
86 [13:31:39] <davin.baragiotta> je crois qu'on en a perdu quelques uns
87 [13:32:13] <olivier.larcheveque> naturellement, nous allons récupérer cette information pour créer un fichier models.py pour notre application 'ancien'
88 [13:33:12] ange.rakotomalala rejoint le salon
89 [13:33:55] <olivier.larcheveque> python manage.py inspectdb --database=consultation-ancien > ancien/models.py
90 [13:34:18] ange.rakotomalala quitte le salon
91 [13:34:36] <olivier.larcheveque> on va s'empresser d'aller tout de suite éditer ce fichier pour ne conserver que le modèle Atelier
92 [13:35:13] <olivier.larcheveque> Q: juste pour savoir .. est-ce qu'on peut «diverger» du modèle proposé par inspectDB ? ou bien doit-on absolument créer *le* modèle qu'il indique ?
93 [13:35:53] <olivier.larcheveque> en fait, c'est un outil qui t'aide à monter un modèle rapide, pour manipuler la bd en Python
94 [13:36:06] <olivier.larcheveque> disons que c'est un point de départ
95 [13:36:58] <olivier.larcheveque> par exemple si tu as une clef étrangère, il va te sortir le champs comme IntegerField, tu pourrais très bien l'ajuster pour que ce soit une ForeignKey
96 [13:38:50] yemen.sayour quitte le salon
97 [13:39:08] yemen.sayour rejoint le salon
98 [13:39:17] <olivier.larcheveque> donc on va un peu compléter ce modèle Atelier
99 [13:39:28] <olivier.larcheveque> en lui ajoutant un méthode __unicode__()
100 [13:40:14] <olivier.larcheveque> afin qu'il affiche son intitule par exemple
101 [13:40:23] franck.kouyami rejoint le salon
102 [13:40:28] <olivier.larcheveque> on va ajouter un fichier au projet
103 [13:40:51] <olivier.larcheveque> cette fois-ci vous pouvez directement le récupérer ici : https://github.com/olarcheveque/atelier-south-inspectdb/blob/master/foad/db.py
104 [13:41:12] <olivier.larcheveque> et le mettre À côté du fichier settings.py
105 [13:41:51] <olivier.larcheveque> et dans le fichier settings.py on déclare un routeur de BD
106 [13:41:55] <olivier.larcheveque> DATABASE_ROUTERS = ['foad.db.AncienRouter', ]
107 [13:42:47] <olivier.larcheveque> sans entrer dans le détail, mais ça peut intéresser JC ;), on y définit la politque d'accès aux BD
108 [13:42:58] yemen.sayour quitte le salon
109 [13:43:34] arnaud.amelina rejoint le salon
110 [13:43:44] <olivier.larcheveque> dans notre cas on peut surtout dire : le modele Atelier travaille avec la BD foad en lecture uniquement
111 [13:43:54] <olivier.larcheveque> (on veut)
112 [13:43:59] jimmy.baroki quitte le salon
113 [13:44:10] <olivier.larcheveque> bon on teste notre modèle
114 [13:44:15] <olivier.larcheveque> python manage.py shell
115 [13:44:30] nguyen.le.duc.huy quitte le salon
116 [13:44:43] <olivier.larcheveque> et nous allons consulter les enregistrements de la table
117 [13:44:54] <olivier.larcheveque> from ancien.models import Atelier; Atelier.objects.all()
118 [13:45:00] Massamba GAYE quitte le salon
119 [13:45:17] <olivier.larcheveque> est-ce qu'il y a des survivants?
120 [13:45:57] jimmy.baroki rejoint le salon
121 [13:46:08] <olivier.larcheveque> rendu là on semonte une petite admin pour ce modèle atelier
122 [13:46:33] <olivier.larcheveque> afin d'avoir un petit visuel sympa dans une page web
123 [13:46:52] <olivier.larcheveque> créer un fichier ancien/admin.py
124 [13:47:05] <olivier.larcheveque> from django.contrib import admin
125 from .models import Atelier
126 admin.site.register(Atelier)
127 [13:47:15] <olivier.larcheveque> c'est suffisant
128 [13:47:28] franck.kouyami quitte le salon
129 [13:49:30] <olivier.larcheveque> on devrait avoir la liste ici : http://127.0.0.1:8000/admin/ancien/atelier/
130 [13:50:55] franck.kouyami rejoint le salon
131 [13:51:12] franck.kouyami quitte le salon
132 [13:51:56] kader quitte le salon
133 [13:52:44] <olivier.larcheveque> ceci clôture la partie inspectdb, mais pas le projet ;)
134 [13:52:52] <olivier.larcheveque> je peux poursuivre?
135 [13:53:34] <davin.baragiotta> go, ongolaBoy suit ;)
136 [13:54:26] kader rejoint le salon
137 [13:55:35] <olivier.larcheveque> on s'attaque maintenant à faire un super site de foad, avec un modèle qui s'appèle 'formation'
138 [13:56:00] <olivier.larcheveque> ca s'appelle 'atelier' dans l'ancienne base
139 [13:56:49] <olivier.larcheveque> si vous regarder bien cette bd, il y a des infos redondantes qu'on pourrait très bien modéliser et faire des foreignkey
140 [13:57:30] <olivier.larcheveque> on va faire un refactoring
141 [13:57:59] <olivier.larcheveque> en francais, je ne sais pas trop comment on dit :)
142 [13:58:26] <olivier.larcheveque> pour cela on va isoler notre travail dans une nouvelle application django
143 [13:58:32] <olivier.larcheveque> python manage.py startapp catalogue
144 [13:58:48] <olivier.larcheveque> et on la cable dans INSTALLED_APPS de settings.py
145 [13:59:23] <olivier.larcheveque> on va maintenant initialiser notre pile de migration pour cette app
146 [13:59:30] <olivier.larcheveque> python manage.py schemamigration catalogue --initial
147 [14:00:01] <olivier.larcheveque> pour pourrez voir qu'un répoertoire migrations a été ajouté dans catalogue
148 [14:00:15] <olivier.larcheveque> ce répertoire contiendra toutes nos futures migrations
149 [14:00:43] <olivier.larcheveque> python manage.py migrate catalogue
150 [14:01:02] <olivier.larcheveque> cette commande va exécuter notre migration
151 [14:01:41] <olivier.larcheveque> celle-ci va simplement avertir south que notre application est gérée par le framework de migration
152 [14:05:01] <olivier.larcheveque> Q:si je comprends bien, si on compte utiliser "south", avant de faire un syncdb pour son app, il faut d'abord initialiser «la pile de migration» ?
153 [14:06:09] sekou.diall quitte le salon
154 [14:06:58] sekou.diall rejoint le salon
155 [14:07:47] <olivier.larcheveque> en fait il y a 2 choses
156 [14:08:32] <olivier.larcheveque> la commande schemamigration avec la paramètre --initial, fait juste te créer un module migration dans ton app avec la première migration
157 [14:09:21] <olivier.larcheveque> dans notre cas on a pas de modèle dans cette app si tu regarde ce fichier : catalogue/migrations/0001_initial.py
158 [14:09:48] <olivier.larcheveque> ca reste néanmoins une migration valide et quand tu fais python manage.py migrate catalogue
159 [14:10:13] <olivier.larcheveque> tu appliques cette migration à ta bd
160 [14:11:27] <olivier.larcheveque> concrètement, rien ne change, mais tu peux voir que dans la bd 'atelier' il y a une table south_history et ton étape de migration est stocké (donc appliquée), ce qui consitute le premier élément de ta pile de migrations
161 [14:12:52] awa.diouf quitte le salon
162 [14:13:41] awa.diouf rejoint le salon
163 [14:16:38] <olivier.larcheveque> ok il reste 15min
164 [14:16:39] stefano.amekoudi rejoint le salon
165 [14:16:52] <olivier.larcheveque> on va essayer juste de finir la première migration
166 [14:17:15] <olivier.larcheveque> créer le fichier catalogue/models.py
167 [14:18:12] <olivier.larcheveque> avec un modèle formation très simple :
168 from django.db import models
169 class Formation(models.Model):titre = models.CharField(max_length=300)
170 def __unicode__(self): return self.titre
171 [14:18:16] <olivier.larcheveque> arf...
172 [14:18:32] <olivier.larcheveque> from django.db import models
173 class Formation(models.Model):
174 titre = models.CharField(max_length=300)
175 def __unicode__(self):
176 return self.titre
177 [14:20:03] <olivier.larcheveque> on va créer la migration, qui va générer la création de cette table en DB
178 [14:20:12] <olivier.larcheveque> python manage.py schemamigration catalogue --auto
179 [14:21:06] <olivier.larcheveque> on peut voir que le fichier catalogue/migrations/0002_auto__add_formation.py a été crée
180 [14:21:42] thierry.tsitoara rejoint le salon
181 [14:22:18] <olivier.larcheveque> on va appliquer notre migration :
182 [14:22:20] <olivier.larcheveque> python manage.py migrate catalogue
183 [14:24:04] <olivier.larcheveque> si vous regarder la bd, la table a bien été crée
184 [14:24:28] <olivier.larcheveque> on va se monter une petite admin pour ce modele
185 [14:24:33] <olivier.larcheveque> catalogue/admin.py
186 [14:24:45] <olivier.larcheveque> from django.contrib import admin
187 from .models import Formation
188 admin.site.register(Formation)
189 [14:25:37] <olivier.larcheveque> maintenant nous allons créer notre première migration de données
190 [14:25:40] brice.ondjibou quitte le salon
191 [14:26:22] <olivier.larcheveque> le but étant de prendre l'intitulé de l'atelier pour qu'il soit transposé dans le titre de la formation
192 [14:26:34] <olivier.larcheveque> création d'une migration de donnée:
193 [14:26:40] <olivier.larcheveque> python manage.py datamigration catalogue recuperation_id_intitule --freeze ancien
194 [14:26:59] <olivier.larcheveque> je lui donne un nom parlant : recuperation_id_intitule
195 [14:27:40] <olivier.larcheveque> --freeze ancien veut dire que dans ma migration de données dans l'app catalogue, j'ai besoin des modèles de mon app ancien
196 [14:28:17] jimmy.baroki quitte le salon
197 [14:28:28] <olivier.larcheveque> un fichier catalogue/migrations/0003_recuperation_id_intitule.py a été crée
198 [14:29:25] <olivier.larcheveque> regarder le puis le contenu de mon fichier ici : https://github.com/olarcheveque/atelier-south-inspectdb/blob/6d153c1c3c4329720fe70a4dc5de6df5a91d41fd/catalogue/migrations/0003_recuperation_id_intitule.py#L9
199 [14:29:44] <olivier.larcheveque> j'ai ajouté le code qui va faire la recopie
200 [14:30:18] <olivier.larcheveque> python manage.py migrate catalogue
201 [14:30:35] <olivier.larcheveque> pour exécuter la migration de données
202 [14:31:22] <olivier.larcheveque> les formations du catalogue ont été crées à partir des anciens atelier
203 [14:34:38] <olivier.larcheveque> il y a d'autres étapes dans la page wiki pour faire d'autres migrations, mais l'atelier arrive à son terme, je reste pour vous aider vous rendre jusqu'ici.
204 [14:34:44] <olivier.larcheveque> merci
205 [14:36:38] <davin.baragiotta> hourra! merci olivier.larcheveque
206 [14:42:13] awa.diouf quitte le salon
207 [14:47:34] toto quitte le salon
208 [14:51:58] toto rejoint le salon
209 [14:53:53] eddy.andriamanantena quitte le salon
210 [14:54:27] <davin.baragiotta> on remarque que l'utilisation de south esst relativement simple : 2 commandes principales ajoutées à django :
211 [14:54:32] <davin.baragiotta> schemamigration
212 [14:54:34] <davin.baragiotta> migrate
213 [14:54:54] <davin.baragiotta> schemamigration --initial (pour la première)
214 [14:55:03] <davin.baragiotta> schemamigration --auto (pour toutes les autres)
215 [14:56:42] <davin.baragiotta> datamigration pour la migration de données...
216 [14:56:59] <davin.baragiotta> (3e commande ajoutée)
217 [15:04:27] massamba.gaye rejoint le salon
218 [15:04:43] sekou.diall quitte le salon
219 [15:05:31] thierry.tsitoara quitte le salon
220 [15:06:25] toto quitte le salon
221 [15:11:17] <arnaud.amelina@auf.org> Ainsi prennent fin les présentations de la SEMAINE TECH 2013
222 [15:11:41] <arnaud.amelina@auf.org> Tous nos remerciement à Tous les Différents Présentateurs
223 [15:12:06] <arnaud.amelina@auf.org> ET un Big Up à toutes les personnes qui ont daigné suivre les différents Ateliers
224 [15:12:37] <arnaud.amelina@auf.org> Merci aux différents modératrices et Modérateurs
225 [15:13:24] <davin.baragiotta> à ajouter en remarque à la fin de l'atelier South svp :
226 [15:13:25] <arnaud.amelina@auf.org> N'oubliez pas ça continue dans les différents Labos
227 [15:13:28] <davin.baragiotta> (11:10:34) davin.baragiotta: bon j'ai réussi tout l'atelier... je crois qu'il faut dire que la migration des "données"... on fait pas ça tous les jours...