Upload
affinitic
View
249
Download
1
Embed Size (px)
Citation preview
SQLAlchemy Déclaratif
1
J Fonctionnalité implémentée à partir de SQLAlchemy 0.5 J Backporté en 0.4 pour nos besoins J Nouvelle manière de définir les tables et leurs relations J L’avenir de SQLAlchemy ?
Kesako ?
2
J SQLAlchemy J Permet d’avoir une meilleure visibilité sur la définition de notre base de données
J Facilite l’écriture de tests
Avantages
3
Imports nécessairesimport sqlalchemyimport zope.interfacefrom arsia.db.pgsql import base, DeclarativeBase
Interface implémentée par la tableclass IBovin(zope.interface.Interface): ‘‘‘ Marker interface for bovines ‘‘‘
Définition d’une table
4
Définition d’une table
Définition de la tableclass 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)
5
Définition d’une table
Définition du schémaclass Bovin(DeclarativeBase, base.MappedClassBase): ...
__tablename__ = u’bovin’ __table_args__ = {‘schema’: ‘cerise’}
Définition d’une relationclass 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éé
6
Définition d’une table
Autre manière de définir une relationclass Bovin(DeclarativeBase, base.MappedClassBase): ...
Bovin.mother = sqlalchemy.orm.relation(Mother, lazy=False, uselist=False)
Définition d’un indexclass Bovin(DeclarativeBase, base.MappedClassBase): ...
sqlalchemy.Index( ‘mark_nr_idx’, Bovin.__table__.c.mark_nr)
7
Définition d’une table
Définition d’une contrainteclass Bovin(DeclarativeBase, base.MappedClassBase): ...
__tablename__ = u’bovin’ __table_args__ = ( sqlalchemy.CheckConstraint(‘mark_nr != name’, name=’test_constraint’), {‘schema’: ‘cerise’})
# Columns
8
Activation de la réflexion des tables
Modification de la classe DeclarativeBasetry: from sqlalchemy.ext.declarative import DeferredReflectionexcept ImportError: from arsia.db.core.declarative import DeferredReflection
DeclarativeBase = sqlalchemy.ext.declarative.declarative_base(cls=DeferredReflection)
9
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
10
Méthodes et propriétés de base
mapper_instance.savemapper_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’)
11
Questions
12
J Implémentation dans arsia.db.pgsql : http://svn.arsia.affinitic.be/ Arsia/zope/arsia.db.pgsql/trunk/src/arsia/db/pgsql/mappers/
J Implémentation dans arsia.db.oracle : http://svn.arsia.affinitic.be/ Arsia/zope/arsia.db.oracle/trunk/src/arsia/db/oracle/mappers/
J Notre version de SQLAlchemy : http://hg.affinitic.be/sqlalchemy/ J Documentation : http://docs.sqlalchemy.org/en/rel_0_7/orm/ extensions/declarative.html
Liens