<p>
	Transcription de l&#39;atelier COAGUL pr&eacute;sent&eacute; par Gnunux le samedi 10 avril 2010.</p>
<h2>
	Introduction</h2>
<p>
	Elixir est une surcouche &agrave; SQLAlchemy.<br />
	SQLAlchemy permet de manipuler des bases de donn&eacute;es en python sans conna&icirc;tre pour autant le langage SQL.</p>
<h2>
	Param&eacute;trage de Vim</h2>
<p>
	Nous pourrions configurer <strong>Vim</strong> une bonne fois pour toute.<br />
	Par contre si nous ajoutons la ligne suivante en bas de notre fichier, <strong>Vim</strong> respectera la configuration indiqu&eacute;e pour ce fichier.<br />
	<code># vim: ts=4 sw=4 expandtab</code><br />
	Les tabulations seront donc de 4 espaces.</p>
<h2>
	Pr&eacute;-requis</h2>
<p>
	Pour notre exemple il vous faut le paquet python-elixir.<br />
	Installer elixir ou python-elixir, tout d&eacute;pend de la distribution GNU/Linux que vous utilisez.<br />
	Ce paquet tirera les d&eacute;pendances.<br />
	Il vous faut &eacute;galement le paquet sqlite3, qui est l&#39;interface permettant de consulter des BDD sqlite en ligne de commande.</p>
<h2>
	Cr&eacute;er un nouveau fichier</h2>
<p>
	Utiliser Vim pour cr&eacute;er notre nouveau fichier :<br />
	<code>$ vim test0.py</code></p>
<h2>
	Code de base</h2>
<pre>
# importe les methodes de la librairie elixir
from elixir import *

# lien vers la base de donnees
metadata.bind =&quot;sqlite:///gaspacho.sqlite&quot;
# creation de la relation entre les classes et les tables
setup_all()
# creation des tables si elles n&#39;existent pas
create_all()

# commit pour que le travail soit pris en compte
session.commit()
# nettoyer la memoire avant la fin du programme
session.flush()
# notre configuration de vim pour ce fichier
# vim: ts=4 sw=4 expandtab
</pre>
<h2>
	Lancer le programme de base</h2>
<p>
	Pour lancer le programme python :<br />
	<code>$ python test0.py</code></p>
<p>
	Le code s&#39;ex&eacute;cute sans erreur, si ce n&#39;est pas le cas il faut corriger.<br />
	Il est possible d&#39;avoir un message vous disant que l&#39;utilisation de setup_all() est d&eacute;pr&eacute;ci&eacute;e.<br />
	N&#39;utilisez pas d&#39;accent dans votre fichier source.</p>
<h2>
	Code pour une base de donn&eacute;es avec donn&eacute;es</h2>
<pre>
# fichier test1.py
# permet d&#39;utiliser des caracteres accentues pour les commentaires
# _*_ coding: utf-8 _*_
from elixir import *

# cr&eacute;ation d&#39;une classe
class Chemin(Entity):
    difficulte = Field(Integer)
    name = Field(UnicodeText)
    # lien avec la class Personne
    personnes = OneToMany(&#39;Personne&#39;)

class Personne(Entity):
    name = Field(UnicodeText)
    age = Field(Integer)
    # lien avec la class Chemin
    chemin = ManyToOne(&#39;Chemin&#39;)

metadata.bind =&quot;sqlite:///gaspacho.sqlite&quot;
setup_all()
create_all()

# =u pour unicode
chemin1 = Chemin(difficulte=5, name=u&#39;Chemin calme au bord de la rivi&egrave;re&#39;)
chemin2 = Chemin(difficulte=1, name=u&#39;Chemin de montagne&#39;)

manu = Personne(name=u&#39;Manu&#39;, age=20)
manu.chemin=chemin1
benjamin = Personne(name=u&#39;Benjamin&#39;, age=42, chemin=chemin2)

session.commit()
session.flush()
# vim: ts=4 sw=4 expandtab
</pre>
<h2>
	Lancer le programme</h2>
<p>
	Pour lancer le programme python :<br />
	<code>$ python test1.py</code></p>
<h2>
	Consulter la base de donn&eacute;es</h2>
<p>
	<code>$ sqlite3 gaspacho.sqlite</code></p>
<p>
	<code>.tables</code> pour lister les tables<br />
	<code>.dump</code> pour faire un dump de la BDD<br />
	<code>.exit</code> pour quitter sqlite3</p>
<p>
	Supprimer la base de donn&eacute;es gaspacho.sqlite</p>
<h2>
	Code pour une autre BDD avec donn&eacute;es</h2>
<pre>
# fichier test2.py
# _*_ coding: utf-8 _*_
from elixir import *

# cr&eacute;ation d&#39;une classe
class Chemin(Entity):
    difficulte = Field(Integer)
    name = Field(UnicodeText)
    # lien avec la class Rdv
    rdv = OneToMany(&#39;Rdv&#39;)

class Personne(Entity):
    name = Field(UnicodeText)
    age = Field(Integer)
    # lien avec la class Rdv
    rdv = ManyToMany(&#39;Rdv&#39;)

class Date(Entity):
    date = Field(UnicodeText)
    # lien avec la class Rdv
    rdvs = OneToMany(&#39;Rdv&#39;)

class Rdv(Entity):
    # relations entre les diff&eacute;rentes class
    date = ManyToOne(&#39;Date&#39;)
    chemin = ManyToOne(&#39;Chemin&#39;)
    personnes = ManyToMany(&#39;Personne&#39;)

metadata.bind =&quot;sqlite:///gaspacho.sqlite&quot;
setup_all()
create_all()

chemin1 = Chemin(difficulte=5, name=u&#39;Chemin calme au bord de la rivi&egrave;re&#39;)
chemin2 = Chemin(difficulte=1, name=u&#39;Chemin de montagne&#39;)

date1 = Date(date=u&#39;18/03/2011&#39;)
date2 = Date(date=u&#39;18/04/2011&#39;)

rdv1 = Rdv(date=date1, chemin=chemin1)
rdv2 = Rdv(date=date2, chemin=chemin2)

manu = Personne(name=u&#39;Manu&#39;, age=20)
manu.rdv=[rdv1,rdv2]
benjamin = Personne(name=u&#39;Benjamin&#39;, age=42, rdv=[rdv1])
session.commit()
session.flush()
# vim: ts=4 sw=4 expandtab
</pre>
<h2>
	Lancer le programme</h2>
<p>
	Pour lancer le programme python :<br />
	<code>$ python test2.py</code></p>
<h2>
	Consulter la base de donn&eacute;es</h2>
<p>
	<code>$ sqlite3 gaspacho.sqlite</code></p>
<p>
	<code>.tables</code> pour lister les tables<br />
	<code>.dump</code> pour faire un dump de la BDD<br />
	<code>.exit</code> pour quitter sqlite3</p>
<p>
	Ne pas supprimer la base de donn&eacute;es gaspacho.sqlite<br />
	Si vous l&#39;avez supprim&eacute;e relancez le programme test2.py</p>
<h2>
	Code pour l&#39;interrogation de la BDD</h2>
<pre>
# fichier test3.py
# _*_ coding: utf-8 _*_
from elixir import *

class Chemin(Entity):
    difficulte = Field(Integer)
    name = Field(UnicodeText)
    rdv = OneToMany(&#39;Rdv&#39;)

class Personne(Entity):
    name = Field(UnicodeText)
    age = Field(Integer)
    rdv = ManyToMany(&#39;Rdv&#39;)

class Date(Entity):
    date = Field(UnicodeText)
    rdvs = OneToMany(&#39;Rdv&#39;)

class Rdv(Entity):
    date = ManyToOne(&#39;Date&#39;)
    chemin = ManyToOne(&#39;Chemin&#39;)
    personnes = ManyToMany(&#39;Personne&#39;)

metadata.bind =&quot;sqlite:///gaspacho.sqlite&quot;
setup_all()

print &#39;&#39;
print &#39;test1&#39;
print Date.query.all()

print &#39;&#39;
print &#39;test1bis&#39;
for date in Date.query.all():
    print date.date

print &#39;&#39;
print &#39;test2&#39;

for rdv in Rdv.query.all():
    for personne in rdv.personnes:
        print personne.age

print &#39;&#39;
print &#39;test3&#39;

date = Date.query.first()

for rdv in Rdv.query.filter_by(date=date).all():
    for personne in rdv.personnes:
        print personne.name,personne.age

print &#39;&#39;
print &#39;test4&#39;

for rdv in Rdv.query.all():
    print rdv.chemin.difficulte

# vim: ts=4 sw=4 expandtab
</pre>
<h2>
	Lancer le programme</h2>
<p>
	Pour lancer le programme python :<br />
	<code>$ python test3.py</code></p>
<h2>
	Fichiers Sources</h2>
<p>
	<a href="http://www.dlareg.org/public/sources/test0.py">test0.py</a><br />
	<a href="http://www.dlareg.org/public/sources/test1.py">test1.py</a><br />
	<a href="http://www.dlareg.org/public/sources/test2.py">test2.py</a></p>
<p>
	<a href="http://www.dlareg.org/public/sources/test3.py">test3.py</a><br />
	<a href="http://www.dlareg.org/public/sources/gaspacho.sqlite">gaspacho.sqlite</a> li&eacute; &agrave; test3.py</p>
<h2>
	Liens</h2>
<p>
	Guide pour Vim :<br />
	<a href="http://all4dev.libre-entreprise.org/index.php/Guide_de_contr%C3%B4le_total_de_vim">http://all4dev.libre-entreprise.org/index.php/Guide_de_contr%C3%B4le_total_de_vim</a><br />
	Utilisation d&#39;Elixir :<br />
	<a href="http://blog.goeminne.eu/index.php?post/2009/11/27/Elixir-%3A-une-surcouche-ORM-pour-Python">http://blog.goeminne.eu/index.php?post/2009/11/27/Elixir-%3A-une-surcouche-ORM-pour-Python</a></p>
