=== ARCHIVE ATELIER DJANGO INSPECTDB MODELES === {{{#!highlight irc [12:33:38] ====================== Debut ATELIER DJANGO INSPECTDB MODELES ... ===================== [12:33:47] bonjour! [12:34:39] Cet atelier couvre un autre aspect qu'on retrouve dans les projets à savoir la communication avec un SGBD [12:35:20] et l'écosystème Django apporte son lot de choses intéressantes pour nous en faciliter la tâche [12:35:25] franck.kouyami quitte le salon [12:36:30] Déjà quelques mots pour expliquer le titre de l'atelier: [12:36:58] InspectDb ca se devine, c'est pour inspecter les bases de données ;) [12:37:55] 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 [12:38:24] Quant à South, c'est plus dur à deviner hein? [12:38:37] c'est en fait un framework de migration. [12:39:07] c'est un concept commun qu'on ne retrouve pas seulement dans Django [12:40:02] Concrêtement, ça sert à faciliter les évolutions (niveau bd) d'un projet [12:41:31] 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.... [12:42:08] il conserve un historique de tout ce qui a été appliquer à la base de donnée, dans quel contexte [12:43:22] Il prend en "photo" l'état de la base de donnée, pour se projeter dans l'état final que vous avez codé [12:43:48] c'est vraiment un composant très important [12:44:18] fini les petits scripts sql à rouler à la main on ne sait plus trop quand ;) [12:44:45] questions sur la présentation des composants? [12:47:19] ange.rakotomalala quitte le salon [12:47:35] ok on procède à l'installation de l'environnement [12:47:45] normalement une grande partie est déjà faite [12:47:47] pascal.bou-nassar quitte le salon [12:48:09] tout le monde a déjà réactivé son environnement "atelier" ? [12:49:09] oui [12:49:18] pour ceux qui sont déjà repartis [12:49:35] il faut installer le package qui permet de communiquer avec une bd MySQL [12:49:49] on va l'installer côté système [12:50:57] bon je ne l'ai pas mis dans la page Wiki [12:51:49] sudo apt-get install python-mysqldb [12:52:05] bon super merci [12:52:10] je cherchais ça ;) [12:52:24] on peut tester : [12:52:28] python -c "import MySQLdb" [12:52:47] avec l'environnemnent d'activé bien sûr [12:53:22] est-ce que tout le monde à préparer sa base de donnée avec le jeu de données FOAD? [12:53:45] kader rejoint le salon [12:53:50] wiki à jour : https://wiki.auf.org/wikiteki/Projet/SemaineTech/2013/Ateliers/DjangoInspectdbSouth [12:55:07] arnaud.amelina quitte le salon [12:56:19] kazuhiro.oguchi rejoint le salon [13:01:53] ok donc tout le monde a à peut près son paquet MySQL qui marche [13:02:02] les données de FOAD en BD [13:02:16] on commence à préparer un projet Django [13:02:37] on poursuit [13:02:44] sur la page [13:02:46] https://wiki.auf.org/wikiteki/Projet/SemaineTech/2013/Ateliers/DjangoInspectdbSouth/Support [13:02:52] darko.stanar rejoint le salon [13:04:04] ok on commence À créer le nouveau projet Django [13:05:04] django-admin.py startproject foad [13:05:15] (j'avais fait une faute sur le wiki) [13:06:19] ok vous pouvez suivre la partie boostrap [13:06:40] au final vous pouvez lancer le serveur Django [13:07:07] bien sûr, si vous testez une réponse, ça ne marchera pas on a rien programmer encore [13:07:16] on s'assure juste que ça run bien [13:07:29] ok jusqu'ici? [13:11:49] 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 [13:11:59] ok, continue [13:12:07] un système avec une structuration différente des données [13:13:02] on poursuit ave la partie "Base de données MySQL" [13:13:32] on va créer une nouvelle base de donnée "atelier" qui sera la cible de notre nouveau projet Django [13:15:02] On va procéder à l'activation de l'admin, vous l'avez vu avec l'atelier backend de Davin [13:17:18] donc au final de cette partie, on peut se connecter à l'admin : http://127.0.0.1:8000/admin/ [13:17:30] j'attends ce checkpoint [13:18:03] (le petit icone tete rouge en colère, ça vous fournit le code source qui marche si vous avez de la difficulté) [13:18:39] tout va bien? [13:20:31] Tri quitte le salon [13:20:45] Q . Au niveau de setting.py, c'est DATABASE_ENGINE = 'default' ou bien ? [13:22:03] R: oui en fait l'entrée 'default' pointe vers notre projet [13:22:12] mais on va communiquer par la suite, avec une autre base de données [13:22:16] on va lui donner une autre clef dans ce dictionnaire [13:22:22] c'est la partie juste après [13:22:35] ok je poursuis [13:22:54] on va justement commencer à se servir de notre bd 'foad' [13:23:15] pour cela on commence par créer une nouvelle application django dans notre projet [13:23:31] eric.mcsween rejoint le salon [13:24:17] django-admin.py startapp ancien [13:26:00] on va ensuite caler cette nouvelle app dans notre projet [13:26:08] dans foad/settings.py [13:26:43] on va l'ajouter dans INSTALLED_APPS [13:27:12] et nous allons déclarer un nouveau pointeur de bd que l'on nomme 'consultation-ancien' [13:27:35] (on peut faire un copier / coller de la partie 'default' de DATABASES) [13:28:08] on va ensuite vérifier que notre pointeur marche bien avec la commande : [13:29:42] python manage.py inspectdb --database=consultation-ancien [13:30:10] vous devriez avoir des modèles Django affichés dans votre terminal [13:30:20] ok? [13:31:04] la toute la base de données à été scannée, et des modèles Django on été générés pour chaque table [13:31:39] je crois qu'on en a perdu quelques uns [13:32:13] naturellement, nous allons récupérer cette information pour créer un fichier models.py pour notre application 'ancien' [13:33:12] ange.rakotomalala rejoint le salon [13:33:55] python manage.py inspectdb --database=consultation-ancien > ancien/models.py [13:34:18] ange.rakotomalala quitte le salon [13:34:36] on va s'empresser d'aller tout de suite éditer ce fichier pour ne conserver que le modèle Atelier [13:35:13] 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 ? [13:35:53] en fait, c'est un outil qui t'aide à monter un modèle rapide, pour manipuler la bd en Python [13:36:06] disons que c'est un point de départ [13:36:58] 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 [13:38:50] yemen.sayour quitte le salon [13:39:08] yemen.sayour rejoint le salon [13:39:17] donc on va un peu compléter ce modèle Atelier [13:39:28] en lui ajoutant un méthode __unicode__() [13:40:14] afin qu'il affiche son intitule par exemple [13:40:23] franck.kouyami rejoint le salon [13:40:28] on va ajouter un fichier au projet [13:40:51] cette fois-ci vous pouvez directement le récupérer ici : https://github.com/olarcheveque/atelier-south-inspectdb/blob/master/foad/db.py [13:41:12] et le mettre À côté du fichier settings.py [13:41:51] et dans le fichier settings.py on déclare un routeur de BD [13:41:55] DATABASE_ROUTERS = ['foad.db.AncienRouter', ] [13:42:47] sans entrer dans le détail, mais ça peut intéresser JC ;), on y définit la politque d'accès aux BD [13:42:58] yemen.sayour quitte le salon [13:43:34] arnaud.amelina rejoint le salon [13:43:44] dans notre cas on peut surtout dire : le modele Atelier travaille avec la BD foad en lecture uniquement [13:43:54] (on veut) [13:43:59] jimmy.baroki quitte le salon [13:44:10] bon on teste notre modèle [13:44:15] python manage.py shell [13:44:30] nguyen.le.duc.huy quitte le salon [13:44:43] et nous allons consulter les enregistrements de la table [13:44:54] from ancien.models import Atelier; Atelier.objects.all() [13:45:00] Massamba GAYE quitte le salon [13:45:17] est-ce qu'il y a des survivants? [13:45:57] jimmy.baroki rejoint le salon [13:46:08] rendu là on semonte une petite admin pour ce modèle atelier [13:46:33] afin d'avoir un petit visuel sympa dans une page web [13:46:52] créer un fichier ancien/admin.py [13:47:05] from django.contrib import admin from .models import Atelier admin.site.register(Atelier) [13:47:15] c'est suffisant [13:47:28] franck.kouyami quitte le salon [13:49:30] on devrait avoir la liste ici : http://127.0.0.1:8000/admin/ancien/atelier/ [13:50:55] franck.kouyami rejoint le salon [13:51:12] franck.kouyami quitte le salon [13:51:56] kader quitte le salon [13:52:44] ceci clôture la partie inspectdb, mais pas le projet ;) [13:52:52] je peux poursuivre? [13:53:34] go, ongolaBoy suit ;) [13:54:26] kader rejoint le salon [13:55:35] on s'attaque maintenant à faire un super site de foad, avec un modèle qui s'appèle 'formation' [13:56:00] ca s'appelle 'atelier' dans l'ancienne base [13:56:49] si vous regarder bien cette bd, il y a des infos redondantes qu'on pourrait très bien modéliser et faire des foreignkey [13:57:30] on va faire un refactoring [13:57:59] en francais, je ne sais pas trop comment on dit :) [13:58:26] pour cela on va isoler notre travail dans une nouvelle application django [13:58:32] python manage.py startapp catalogue [13:58:48] et on la cable dans INSTALLED_APPS de settings.py [13:59:23] on va maintenant initialiser notre pile de migration pour cette app [13:59:30] python manage.py schemamigration catalogue --initial [14:00:01] pour pourrez voir qu'un répoertoire migrations a été ajouté dans catalogue [14:00:15] ce répertoire contiendra toutes nos futures migrations [14:00:43] python manage.py migrate catalogue [14:01:02] cette commande va exécuter notre migration [14:01:41] celle-ci va simplement avertir south que notre application est gérée par le framework de migration [14:05:01] 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» ? [14:06:09] sekou.diall quitte le salon [14:06:58] sekou.diall rejoint le salon [14:07:47] en fait il y a 2 choses [14:08:32] la commande schemamigration avec la paramètre --initial, fait juste te créer un module migration dans ton app avec la première migration [14:09:21] dans notre cas on a pas de modèle dans cette app si tu regarde ce fichier : catalogue/migrations/0001_initial.py [14:09:48] ca reste néanmoins une migration valide et quand tu fais python manage.py migrate catalogue [14:10:13] tu appliques cette migration à ta bd [14:11:27] 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 [14:12:52] awa.diouf quitte le salon [14:13:41] awa.diouf rejoint le salon [14:16:38] ok il reste 15min [14:16:39] stefano.amekoudi rejoint le salon [14:16:52] on va essayer juste de finir la première migration [14:17:15] créer le fichier catalogue/models.py [14:18:12] avec un modèle formation très simple : from django.db import models class Formation(models.Model):titre = models.CharField(max_length=300) def __unicode__(self): return self.titre [14:18:16] arf... [14:18:32] from django.db import models class Formation(models.Model): titre = models.CharField(max_length=300) def __unicode__(self): return self.titre [14:20:03] on va créer la migration, qui va générer la création de cette table en DB [14:20:12] python manage.py schemamigration catalogue --auto [14:21:06] on peut voir que le fichier catalogue/migrations/0002_auto__add_formation.py a été crée [14:21:42] thierry.tsitoara rejoint le salon [14:22:18] on va appliquer notre migration : [14:22:20] python manage.py migrate catalogue [14:24:04] si vous regarder la bd, la table a bien été crée [14:24:28] on va se monter une petite admin pour ce modele [14:24:33] catalogue/admin.py [14:24:45] from django.contrib import admin from .models import Formation admin.site.register(Formation) [14:25:37] maintenant nous allons créer notre première migration de données [14:25:40] brice.ondjibou quitte le salon [14:26:22] le but étant de prendre l'intitulé de l'atelier pour qu'il soit transposé dans le titre de la formation [14:26:34] création d'une migration de donnée: [14:26:40] python manage.py datamigration catalogue recuperation_id_intitule --freeze ancien [14:26:59] je lui donne un nom parlant : recuperation_id_intitule [14:27:40] --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 [14:28:17] jimmy.baroki quitte le salon [14:28:28] un fichier catalogue/migrations/0003_recuperation_id_intitule.py a été crée [14:29:25] 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 [14:29:44] j'ai ajouté le code qui va faire la recopie [14:30:18] python manage.py migrate catalogue [14:30:35] pour exécuter la migration de données [14:31:22] les formations du catalogue ont été crées à partir des anciens atelier [14:34:38] 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. [14:34:44] merci [14:36:38] hourra! merci olivier.larcheveque [14:42:13] awa.diouf quitte le salon [14:47:34] toto quitte le salon [14:51:58] toto rejoint le salon [14:53:53] eddy.andriamanantena quitte le salon [14:54:27] on remarque que l'utilisation de south esst relativement simple : 2 commandes principales ajoutées à django : [14:54:32] schemamigration [14:54:34] migrate [14:54:54] schemamigration --initial (pour la première) [14:55:03] schemamigration --auto (pour toutes les autres) [14:56:42] datamigration pour la migration de données... [14:56:59] (3e commande ajoutée) [15:04:27] massamba.gaye rejoint le salon [15:04:43] sekou.diall quitte le salon [15:05:31] thierry.tsitoara quitte le salon [15:06:25] toto quitte le salon [15:11:17] Ainsi prennent fin les présentations de la SEMAINE TECH 2013 [15:11:41] Tous nos remerciement à Tous les Différents Présentateurs [15:12:06] ET un Big Up à toutes les personnes qui ont daigné suivre les différents Ateliers [15:12:37] Merci aux différents modératrices et Modérateurs [15:13:24] à ajouter en remarque à la fin de l'atelier South svp : [15:13:25] N'oubliez pas ça continue dans les différents Labos [15:13:28] (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... }}}