SlideShare uma empresa Scribd logo
1 de 13
Baixar para ler offline
SQLAlchemy Déclaratif
Kesako ?
JJ   Fonctionnalité implémentée à partir de SQLAlchemy 0.5
JJ   Backporté en 0.4 pour nos besoins
JJ   Nouvelle manière de définir les tables et leurs relations
JJ   L’avenir de SQLAlchemy ?




                                                                 1
Avantages
JJ   SQLAlchemy
JJ   P
      ermet d’avoir une meilleure visibilité sur la définition de notre base
     de données
JJ   Facilite l’écriture de tests




                                                                                2
Définition d’une table
Imports nécessaires
import sqlalchemy
import zope.interface
from arsia.db.pgsql import base, DeclarativeBase



Interface implémentée par la table
class IBovin(zope.interface.Interface):
	 ‘‘‘ Marker interface for bovines ‘‘‘




                                                   3
Définition d’une table
Définition de la table
class Bovin(DeclarativeBase, base.MappedClassBase):
	 ‘‘‘ Mapper for the bovine table ‘‘‘
	zope.interface.implements(IBovin)

	   __tablename__ = u’bovin’

	   # Columns
	   mark_nr = sqlalchemy.Column(‘mark_nr’, sqlalchemy.Text, nullable=False,
                                primary_key=True, unique=True)
	   birth_date = sqlalchemy.Column(‘begin_date’, sqlalchemy.DateTime,
                                   nullable=False)
	   name = sqlalchemy.Column(‘denomination’, sqlalchemy.Text)




                                                                              4
Définition d’une table
Définition du schéma
class Bovin(DeclarativeBase, base.MappedClassBase):
	...

	   __tablename__ = u’bovin’
	   __table_args__ = {‘schema’: ‘cerise’}



Définition d’une relation
class Bovin(DeclarativeBase, base.MappedClassBase):
	...

	@classmethod
	 def __declare_last__(cls):
	 ‘‘‘ Defines the relations ‘‘‘
	 from mappers import mother
	 Bovin.mother = sqlalchemy.orm.relation(mother.Mother,
                                        lazy=False,
                                        uselist=False)
Les relations doivent être définie sur un objet pour lequel le mapper a été créé




                                                                                   5
Définition d’une table
Autre manière de définir une relation
class Bovin(DeclarativeBase, base.MappedClassBase):
	...

Bovin.mother = sqlalchemy.orm.relation(Mother,
                                       lazy=False,
                                       uselist=False)



Définition d’un index
class Bovin(DeclarativeBase, base.MappedClassBase):
	...

sqlalchemy.Index(
	‘mark_nr_idx’,
	Bovin.__table__.c.mark_nr)




                                                        6
Définition d’une table
Définition d’une contrainte
class Bovin(DeclarativeBase, base.MappedClassBase):
	...

	 __tablename__ = u’bovin’
	 __table_args__ = (
		 sqlalchemy.CheckConstraint(‘mark_nr != name’, name=’test_constraint’),
		     {‘schema’: ‘cerise’})

	   # Columns




                                                                            7
Activation de la réflexion des tables
Modification de la classe DeclarativeBase
try:
	 from sqlalchemy.ext.declarative import DeferredReflection
except ImportError:
	 from arsia.db.core.declarative import DeferredReflection

DeclarativeBase = sqlalchemy.ext.declarative.declarative_base(cls=DeferredReflection)




                                                                                        8
Méthodes et propriétés de bases
mapper_instance.session
Renvoi la session associée à l’objet courant ou une nouvelle session


mapper_instance.asDict(self)
Renvoi l’objet courant sous la forme d’un dictionnaire


mapper_instance.clone(self)
Renvoi une copie de l’objet courant


mapper_instance.update(self, flush=True, commit=False)
Met à jour l’objet courant dans la DB


mapper_instance.insert(self, flush=True, commit=False)
Insert l’objet courant dans la DB


mapper_instance.save_or_update(self, flush=True, commit=False)
Insert ou met à jour l’objet courant dans la DB




                                                                       9
Méthodes et propriétés de base
mapper_instance.save
mapper_instance.add
Aliases de mapper_instance.insert


Mapper.exists(cls, **kwargs)
Renvoi un booléen si une ligne dans la base de donnée correspond aux filtres données
Exemple : Bovin.exists(mark_nr=u’BE12345678’)


Mapper.get(cls, **kwargs)
Renvoi une liste de résultat qui correspond aux filtres données
Exemple d’utilisation : Bovin.get(snun_cde=u’BE12345678-0101’)


Mapper.first(cls, **kwargs)
Renvoi le premier résultat qui correspond aux filtres données
Exemple d’utilisation : Bovin.fist(mark_nr=u’BE12345678’)




                                                                                       10
Questions




            11
Liens
JJ   I
      mplémentation dans arsia.db.pgsql : http://svn.arsia.affinitic.be/
     Arsia/zope/arsia.db.pgsql/trunk/src/arsia/db/pgsql/mappers/
JJ   I
      mplémentation dans arsia.db.oracle : http://svn.arsia.affinitic.be/
     Arsia/zope/arsia.db.oracle/trunk/src/arsia/db/oracle/mappers/
JJ   Notre version de SQLAlchemy : http://hg.affinitic.be/sqlalchemy/
JJ   Documentation : http://docs.sqlalchemy.org/en/rel_0_7/orm/
      extensions/declarative.html




                                                                             12

Mais conteúdo relacionado

Mais procurados

php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDOAbdoulaye Dieng
 
Php 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVCPhp 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVCPierre Faure
 
Php mysql cours
Php mysql coursPhp mysql cours
Php mysql courszan
 
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...Fabien Potencier
 
Bases de PHP - Partie 1
Bases de PHP - Partie 1Bases de PHP - Partie 1
Bases de PHP - Partie 1Régis Lutter
 
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...Tarik Zakaria Benmerar
 
Programmation Orientée Objet et les Traits en PHP 5.4
Programmation Orientée Objet et les Traits en PHP 5.4Programmation Orientée Objet et les Traits en PHP 5.4
Programmation Orientée Objet et les Traits en PHP 5.4halleck45
 
JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java Youness Boukouchi
 
Cours php & Mysql - 4éme partie
Cours php & Mysql - 4éme partieCours php & Mysql - 4éme partie
Cours php & Mysql - 4éme partiekadzaki
 

Mais procurados (13)

php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
 
Php 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVCPhp 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVC
 
Php mysql cours
Php mysql coursPhp mysql cours
Php mysql cours
 
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
 
Introduction au Jquery
Introduction au JqueryIntroduction au Jquery
Introduction au Jquery
 
Bases de PHP - Partie 1
Bases de PHP - Partie 1Bases de PHP - Partie 1
Bases de PHP - Partie 1
 
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
 
Programmation Orientée Objet et les Traits en PHP 5.4
Programmation Orientée Objet et les Traits en PHP 5.4Programmation Orientée Objet et les Traits en PHP 5.4
Programmation Orientée Objet et les Traits en PHP 5.4
 
JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java
 
Interfaces controlesbasededonné
Interfaces controlesbasededonnéInterfaces controlesbasededonné
Interfaces controlesbasededonné
 
Jquery : les bases
Jquery : les basesJquery : les bases
Jquery : les bases
 
jQuery
jQueryjQuery
jQuery
 
Cours php & Mysql - 4éme partie
Cours php & Mysql - 4éme partieCours php & Mysql - 4éme partie
Cours php & Mysql - 4éme partie
 

Destaque

Cypyth formation-programmation-objet-en-langage-python
Cypyth formation-programmation-objet-en-langage-pythonCypyth formation-programmation-objet-en-langage-python
Cypyth formation-programmation-objet-en-langage-pythonCERTyou Formation
 
OpenStack Havana, tour d'horizon
OpenStack Havana, tour d'horizonOpenStack Havana, tour d'horizon
OpenStack Havana, tour d'horizonYannick Foeillet
 
SeSQL : un moteur de recherche en Python et PostgreSQL
SeSQL : un moteur de recherche en Python et PostgreSQLSeSQL : un moteur de recherche en Python et PostgreSQL
SeSQL : un moteur de recherche en Python et PostgreSQLParis, France
 
Les langages de programmation sont trop compliqués
Les langages de programmation sont trop compliquésLes langages de programmation sont trop compliqués
Les langages de programmation sont trop compliquésmercury_wood
 
Base NoSql et Python
Base NoSql et PythonBase NoSql et Python
Base NoSql et Pythonyboussard
 
Modelisation agile 03122011
Modelisation agile  03122011Modelisation agile  03122011
Modelisation agile 03122011agnes_crepet
 
Chp3 - Diagramme de Classes
Chp3 - Diagramme de ClassesChp3 - Diagramme de Classes
Chp3 - Diagramme de ClassesLilia Sfaxi
 
Python et son intégration avec Odoo
Python et son intégration avec OdooPython et son intégration avec Odoo
Python et son intégration avec OdooHassan WAHSISS
 
Chap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec pythonChap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec pythonMohammed TAMALI
 
Introduction à la POO - cours 1h
Introduction à la POO - cours 1hIntroduction à la POO - cours 1h
Introduction à la POO - cours 1hJohann Dreo
 
Programmation orienté aspect
Programmation orienté aspectProgrammation orienté aspect
Programmation orienté aspectmeriem sari
 
alphorm.com - Formation UML
alphorm.com - Formation UMLalphorm.com - Formation UML
alphorm.com - Formation UMLAlphorm
 
gestion de magasin vente matériels informatique
gestion de magasin vente matériels informatiquegestion de magasin vente matériels informatique
gestion de magasin vente matériels informatiqueOussama Yoshiki
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancépierrepo
 

Destaque (20)

Cypyth formation-programmation-objet-en-langage-python
Cypyth formation-programmation-objet-en-langage-pythonCypyth formation-programmation-objet-en-langage-python
Cypyth formation-programmation-objet-en-langage-python
 
OpenStack Havana, tour d'horizon
OpenStack Havana, tour d'horizonOpenStack Havana, tour d'horizon
OpenStack Havana, tour d'horizon
 
La sabiduría
La sabiduríaLa sabiduría
La sabiduría
 
Solucion y Psicologia del Bienestar
Solucion y Psicologia del BienestarSolucion y Psicologia del Bienestar
Solucion y Psicologia del Bienestar
 
Python debugger
Python debuggerPython debugger
Python debugger
 
SeSQL : un moteur de recherche en Python et PostgreSQL
SeSQL : un moteur de recherche en Python et PostgreSQLSeSQL : un moteur de recherche en Python et PostgreSQL
SeSQL : un moteur de recherche en Python et PostgreSQL
 
Les langages de programmation sont trop compliqués
Les langages de programmation sont trop compliquésLes langages de programmation sont trop compliqués
Les langages de programmation sont trop compliqués
 
Base NoSql et Python
Base NoSql et PythonBase NoSql et Python
Base NoSql et Python
 
Modelisation agile 03122011
Modelisation agile  03122011Modelisation agile  03122011
Modelisation agile 03122011
 
Chp3 - Diagramme de Classes
Chp3 - Diagramme de ClassesChp3 - Diagramme de Classes
Chp3 - Diagramme de Classes
 
Python et son intégration avec Odoo
Python et son intégration avec OdooPython et son intégration avec Odoo
Python et son intégration avec Odoo
 
UML+Python
UML+PythonUML+Python
UML+Python
 
Chap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec pythonChap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec python
 
Introduction à la POO - cours 1h
Introduction à la POO - cours 1hIntroduction à la POO - cours 1h
Introduction à la POO - cours 1h
 
Programmation orienté aspect
Programmation orienté aspectProgrammation orienté aspect
Programmation orienté aspect
 
alphorm.com - Formation UML
alphorm.com - Formation UMLalphorm.com - Formation UML
alphorm.com - Formation UML
 
gestion de magasin vente matériels informatique
gestion de magasin vente matériels informatiquegestion de magasin vente matériels informatique
gestion de magasin vente matériels informatique
 
CM uml-concepts-avances
CM uml-concepts-avancesCM uml-concepts-avances
CM uml-concepts-avances
 
Python après 15 ans de JAVA
Python après 15 ans de JAVAPython après 15 ans de JAVA
Python après 15 ans de JAVA
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancé
 

Semelhante a Sqlalchemy declaratif

Marzouk une introduction à jdbc
Marzouk une introduction à jdbcMarzouk une introduction à jdbc
Marzouk une introduction à jdbcabderrahim marzouk
 
chapitre6_Le_Langage_SQL-2.pdf
chapitre6_Le_Langage_SQL-2.pdfchapitre6_Le_Langage_SQL-2.pdf
chapitre6_Le_Langage_SQL-2.pdfattamatta1234
 
Présentaion sur le modéle JDBC JEE .pptx
Présentaion sur le modéle JDBC JEE .pptxPrésentaion sur le modéle JDBC JEE .pptx
Présentaion sur le modéle JDBC JEE .pptxsalmachtioui1
 
LP_chapitre3_Creation et gestion_BD_2019.pptx
LP_chapitre3_Creation et gestion_BD_2019.pptxLP_chapitre3_Creation et gestion_BD_2019.pptx
LP_chapitre3_Creation et gestion_BD_2019.pptxFATIMAEZZAHRAEOUBELL
 
Quickie Incanter/Clojure à Devoxx France 2012
Quickie Incanter/Clojure à Devoxx France 2012Quickie Incanter/Clojure à Devoxx France 2012
Quickie Incanter/Clojure à Devoxx France 2012Claude Falguiere
 
Java - JDBC - 2 - Intructions SQL
Java - JDBC - 2 - Intructions SQLJava - JDBC - 2 - Intructions SQL
Java - JDBC - 2 - Intructions SQLNoël
 
Développement Web- PHP (partie II).pdf
Développement Web- PHP (partie II).pdfDéveloppement Web- PHP (partie II).pdf
Développement Web- PHP (partie II).pdfYasushiTsubakik
 
Cours PHP PDO intégrale afin de mieux appréhender la nouvelle librairie
Cours PHP PDO intégrale afin de mieux appréhender la nouvelle librairieCours PHP PDO intégrale afin de mieux appréhender la nouvelle librairie
Cours PHP PDO intégrale afin de mieux appréhender la nouvelle librairieafdoumbia
 
4- Architectures physique et logique d'ODI 11
4-  Architectures physique et logique d'ODI 114-  Architectures physique et logique d'ODI 11
4- Architectures physique et logique d'ODI 11samr
 
Optimisation du stockage share point 2010
Optimisation du stockage share point 2010Optimisation du stockage share point 2010
Optimisation du stockage share point 2010Nicolas Georgeault
 
Classes et Objets.pdf
Classes et Objets.pdfClasses et Objets.pdf
Classes et Objets.pdfAabidiHafid
 
Ado.net vs jpa
Ado.net vs jpaAdo.net vs jpa
Ado.net vs jpaNetways
 

Semelhante a Sqlalchemy declaratif (20)

Mpdf 3
Mpdf 3Mpdf 3
Mpdf 3
 
Marzouk une introduction à jdbc
Marzouk une introduction à jdbcMarzouk une introduction à jdbc
Marzouk une introduction à jdbc
 
chapitre6_Le_Langage_SQL-2.pdf
chapitre6_Le_Langage_SQL-2.pdfchapitre6_Le_Langage_SQL-2.pdf
chapitre6_Le_Langage_SQL-2.pdf
 
Présentaion sur le modéle JDBC JEE .pptx
Présentaion sur le modéle JDBC JEE .pptxPrésentaion sur le modéle JDBC JEE .pptx
Présentaion sur le modéle JDBC JEE .pptx
 
Mpdf 2
Mpdf 2Mpdf 2
Mpdf 2
 
LP_chapitre3_Creation et gestion_BD_2019.pptx
LP_chapitre3_Creation et gestion_BD_2019.pptxLP_chapitre3_Creation et gestion_BD_2019.pptx
LP_chapitre3_Creation et gestion_BD_2019.pptx
 
Quickie Incanter/Clojure à Devoxx France 2012
Quickie Incanter/Clojure à Devoxx France 2012Quickie Incanter/Clojure à Devoxx France 2012
Quickie Incanter/Clojure à Devoxx France 2012
 
Java - JDBC - 2 - Intructions SQL
Java - JDBC - 2 - Intructions SQLJava - JDBC - 2 - Intructions SQL
Java - JDBC - 2 - Intructions SQL
 
Mpdf 4
Mpdf 4Mpdf 4
Mpdf 4
 
Sql & excel
Sql & excelSql & excel
Sql & excel
 
Mpdf 8
Mpdf 8Mpdf 8
Mpdf 8
 
Développement Web- PHP (partie II).pdf
Développement Web- PHP (partie II).pdfDéveloppement Web- PHP (partie II).pdf
Développement Web- PHP (partie II).pdf
 
Cours PHP PDO intégrale afin de mieux appréhender la nouvelle librairie
Cours PHP PDO intégrale afin de mieux appréhender la nouvelle librairieCours PHP PDO intégrale afin de mieux appréhender la nouvelle librairie
Cours PHP PDO intégrale afin de mieux appréhender la nouvelle librairie
 
3-android.pdf
3-android.pdf3-android.pdf
3-android.pdf
 
4- Architectures physique et logique d'ODI 11
4-  Architectures physique et logique d'ODI 114-  Architectures physique et logique d'ODI 11
4- Architectures physique et logique d'ODI 11
 
Optimisation du stockage share point 2010
Optimisation du stockage share point 2010Optimisation du stockage share point 2010
Optimisation du stockage share point 2010
 
Classes et Objets.pdf
Classes et Objets.pdfClasses et Objets.pdf
Classes et Objets.pdf
 
Mpdf 13
Mpdf 13Mpdf 13
Mpdf 13
 
Ado.net vs jpa
Ado.net vs jpaAdo.net vs jpa
Ado.net vs jpa
 
Mpdf 11
Mpdf 11Mpdf 11
Mpdf 11
 

Sqlalchemy declaratif

  • 2. Kesako ? JJ Fonctionnalité implémentée à partir de SQLAlchemy 0.5 JJ Backporté en 0.4 pour nos besoins JJ Nouvelle manière de définir les tables et leurs relations JJ L’avenir de SQLAlchemy ? 1
  • 3. Avantages JJ SQLAlchemy JJ P ermet d’avoir une meilleure visibilité sur la définition de notre base de données JJ Facilite l’écriture de tests 2
  • 4. Définition d’une table Imports nécessaires import sqlalchemy import zope.interface from arsia.db.pgsql import base, DeclarativeBase Interface implémentée par la table class IBovin(zope.interface.Interface): ‘‘‘ Marker interface for bovines ‘‘‘ 3
  • 5. Définition d’une table Définition de la table class Bovin(DeclarativeBase, base.MappedClassBase): ‘‘‘ Mapper for the bovine table ‘‘‘ zope.interface.implements(IBovin) __tablename__ = u’bovin’ # Columns mark_nr = sqlalchemy.Column(‘mark_nr’, sqlalchemy.Text, nullable=False, primary_key=True, unique=True) birth_date = sqlalchemy.Column(‘begin_date’, sqlalchemy.DateTime, nullable=False) name = sqlalchemy.Column(‘denomination’, sqlalchemy.Text) 4
  • 6. Définition d’une table Définition du schéma class Bovin(DeclarativeBase, base.MappedClassBase): ... __tablename__ = u’bovin’ __table_args__ = {‘schema’: ‘cerise’} Définition d’une relation class Bovin(DeclarativeBase, base.MappedClassBase): ... @classmethod def __declare_last__(cls): ‘‘‘ Defines the relations ‘‘‘ from mappers import mother Bovin.mother = sqlalchemy.orm.relation(mother.Mother, lazy=False, uselist=False) Les relations doivent être définie sur un objet pour lequel le mapper a été créé 5
  • 7. Définition d’une table Autre manière de définir une relation class Bovin(DeclarativeBase, base.MappedClassBase): ... Bovin.mother = sqlalchemy.orm.relation(Mother, lazy=False, uselist=False) Définition d’un index class Bovin(DeclarativeBase, base.MappedClassBase): ... sqlalchemy.Index( ‘mark_nr_idx’, Bovin.__table__.c.mark_nr) 6
  • 8. Définition d’une table Définition d’une contrainte class Bovin(DeclarativeBase, base.MappedClassBase): ... __tablename__ = u’bovin’ __table_args__ = ( sqlalchemy.CheckConstraint(‘mark_nr != name’, name=’test_constraint’), {‘schema’: ‘cerise’}) # Columns 7
  • 9. Activation de la réflexion des tables Modification de la classe DeclarativeBase try: from sqlalchemy.ext.declarative import DeferredReflection except ImportError: from arsia.db.core.declarative import DeferredReflection DeclarativeBase = sqlalchemy.ext.declarative.declarative_base(cls=DeferredReflection) 8
  • 10. Méthodes et propriétés de bases mapper_instance.session Renvoi la session associée à l’objet courant ou une nouvelle session mapper_instance.asDict(self) Renvoi l’objet courant sous la forme d’un dictionnaire mapper_instance.clone(self) Renvoi une copie de l’objet courant mapper_instance.update(self, flush=True, commit=False) Met à jour l’objet courant dans la DB mapper_instance.insert(self, flush=True, commit=False) Insert l’objet courant dans la DB mapper_instance.save_or_update(self, flush=True, commit=False) Insert ou met à jour l’objet courant dans la DB 9
  • 11. Méthodes et propriétés de base mapper_instance.save mapper_instance.add Aliases de mapper_instance.insert Mapper.exists(cls, **kwargs) Renvoi un booléen si une ligne dans la base de donnée correspond aux filtres données Exemple : Bovin.exists(mark_nr=u’BE12345678’) Mapper.get(cls, **kwargs) Renvoi une liste de résultat qui correspond aux filtres données Exemple d’utilisation : Bovin.get(snun_cde=u’BE12345678-0101’) Mapper.first(cls, **kwargs) Renvoi le premier résultat qui correspond aux filtres données Exemple d’utilisation : Bovin.fist(mark_nr=u’BE12345678’) 10
  • 12. Questions 11
  • 13. Liens JJ I mplémentation dans arsia.db.pgsql : http://svn.arsia.affinitic.be/ Arsia/zope/arsia.db.pgsql/trunk/src/arsia/db/pgsql/mappers/ JJ I mplémentation dans arsia.db.oracle : http://svn.arsia.affinitic.be/ Arsia/zope/arsia.db.oracle/trunk/src/arsia/db/oracle/mappers/ JJ Notre version de SQLAlchemy : http://hg.affinitic.be/sqlalchemy/ JJ Documentation : http://docs.sqlalchemy.org/en/rel_0_7/orm/ extensions/declarative.html 12