Projet / SemaineTech / 2013 / Ateliers / DjangoInspectdbSouth / Archive

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...

Projet/SemaineTech/2013/Ateliers/DjangoInspectdbSouth/Archive (dernière édition le 2013-10-23 15:08:37 par AdoAdamouAbbaAri)