## page was renamed from Projet/SemaineTech/2013/Ateliers/DjangoInspectdbSouth/support
= Django : SGBD inspectDb et South =

<<TableOfContents(3)>>

Légende: Les X-( sont les liens directs vers le code source, si vous voulez voir une solution qui marche

== Chargement de l'environnement virtuel ==


([[Projet/SemaineTech/2013/Ateliers/DjangoInspectdbSouth|Voir les prérequis de l'atelier]])

{{{
source atelier/bin/activate
}}}

== Création d'un projet Django ==


=== Boostrap ===

{{{
django-admin.py startproject foad
cd foad
python manage.py runserver (CTRL+C)
echo "*.pyc" > .gitignore
git init
git add .
git commit -m 'nouveau projet'
}}}

{{{#!wiki blue
{OK} à chaque modification correcte au cours de l'atelier, commiter-les, vous pourrez plus facilement voir les modifications de fichiers,
revenir en arrière, etc...
}}}


=== Base de données MySQL ===

  * dans 'foad/settings.py': 
    * variable DATABASES, configurer le 'default' avec une bd vierge nommée 'atelier'
    * variable INSTALLED_APPS, ajouter 'south'
  X-( [[https://github.com/olarcheveque/atelier-south-inspectdb/blob/master/foad/settings.py]]

{{{
python manage.py syncdb
}}}(créer le superuser)

=== Activation de l'admin ===

  * dans 'foad/settings.py':
    * variable INSTALLED_APPS, décommenter 'django.contrib.admin'
  X-( [[https://github.com/olarcheveque/atelier-south-inspectdb/blob/master/foad/settings.py]]

  * dans 'foad/urls.py',décommenter:
    {{{
    from django.contrib import admin
    admin.autodiscover()
    url(r'^admin/', include(admin.site.urls)),
    }}}
    X-( [[https://github.com/olarcheveque/atelier-south-inspectdb/blob/master/foad/urls.py]]

  * {{{ python manage.py runserver }}} (127.0.0.1:8000/admin)


== Exploiter l'existant ==

Création de l'application
{{{
django-admin.py startapp ancien
}}}

=== Câblage db ===

  * dans 'foad/settings.py':
    * variable DATABASES, ajouter une nouvelle entrée au dictionnaire avec comme clef 'consultation-ancien'
    * variable INSTALLED_APPS, ajouter votre nouvelle application: 'ancien'

  * python manage.py inspectdb --database=consultation-ancien
  * python manage.py inspectdb --database=consultation-ancien > ancien/models.py
  * ouvrir le fichier ancien/models.py et ne garder que le modèle 'Atelier'
  * ajouter une méthode __unicode__() pour afficher l'intitulé quand on inspecte un objet
  X-( https://github.com/olarcheveque/atelier-south-inspectdb/blob/master/ancien/models.py

  * cabler le router de base de données (défini la politque d'accès aux bds)
    * X-( [[https://github.com/olarcheveque/atelier-south-inspectdb/blob/master/foad/db.py]]
    * X-( [[https://github.com/olarcheveque/atelier-south-inspectdb/blob/master/foad/settings.py#L30]]
  * python manage.py shell
   {{{
   from ancien.models import Atelier; Atelier.objects.all()
   }}}

=== Câblage de l'ancien dans l'admin ===

  * création d'un fichier ancien/admin.py

  X-( [[ https://github.com/olarcheveque/atelier-south-inspectdb/blob/7b48f15e6ab64589bc39e24fcb2e00b5d5541cdd/ancien/admin.py ]]

== Nouveau système ==

{{{
python manage.py startapp catalogue
}}}
  * dans 'foad/settings.py':
    * variable INSTALLED_APPS, ajouter votre nouvelle application: 'catalogue'

=== initialisation du framework de migration pour l'app ===

{{{
python manage.py schemamigration catalogue --initial
python manage.py migrate catalogue
}}}

=== Création du script de modification de BD selon le modèle ===

* création du modèle Formation dans catalogue/models.py

X-( [[https://github.com/olarcheveque/atelier-south-inspectdb/blob/6d153c1c3c4329720fe70a4dc5de6df5a91d41fd/catalogue/models.py ]]

{{{
python manage.py schemamigration catalogue --auto
python manage.py migrate catalogue
}}}

* création d'un fichier catalogue/admin.py
X-( [[ https://github.com/olarcheveque/atelier-south-inspectdb/blob/6d153c1c3c4329720fe70a4dc5de6df5a91d41fd/catalogue/admin.py ]]

=== Itération 1 (création des formations à partir de l'existant) ===
{{{
python manage.py datamigration catalogue recuperation_id_intitule  --freeze ancien
}}}

X-( [[https://github.com/olarcheveque/atelier-south-inspectdb/blob/6d153c1c3c4329720fe70a4dc5de6df5a91d41fd/catalogue/migrations/0003_recuperation_id_intitule.py#L9 ]]


=== Itération 2 (création des universités à partir de l'existant) ===
* ajout du modèle Universite dans catalogue/models.py
{{{
python manage.py schemamigration catalogue --auto
python manage.py migrate catalogue
}}}
{{{
python manage.py datamigration catalogue creation_universite  --freeze ancien
}}}
X-( [[https://github.com/olarcheveque/atelier-south-inspectdb/blob/cd81764142cce07ee2fb050e237a73f2815eb17c/catalogue/models.py]]
{{{
python manage.py migrate catalogue
}}}
X-( [[https://github.com/olarcheveque/atelier-south-inspectdb/blob/master/catalogue/migrations/0005_creation_universite.py#L9]]

=== Itération 3 (création des domaines à partir de l'existant) ===
* ajout du modèle Universite dans catalogue/models.py
X-( [[https://github.com/olarcheveque/atelier-south-inspectdb/blob/master/catalogue/models.py#L20]]
{{{
python manage.py schemamigration catalogue --auto
python manage.py migrate catalogue
}}}

{{{
python manage.py datamigration catalogue creation_domaine  --freeze ancien
}}}
X-( [[https://github.com/olarcheveque/atelier-south-inspectdb/blob/master/catalogue/migrations/0007_creation_domaine.py#L9]]
{{{
python manage.py migrate catalogue
}}}

== Commandes utiles ==

En cas, d'une migration échouée, comme les modifications ne sont pas
transactionnelles, il est bon resetter l'application dans un état stable,
corrélé avec les modèles.

{{{
python manage.py sqlclear catalogue > del_catalogue
mysql -u <user> -p --database=atelier < del_catalogue
python manage.py dbshell
  - delete from south_migrationhistory where app_name = 'catalogue';
}}}