13
SQLAlchemy Déclaratif

Sqlalchemy declaratif

Embed Size (px)

Citation preview

Page 1: Sqlalchemy declaratif

SQLAlchemy Déclaratif

Page 2: Sqlalchemy declaratif

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 ?

Page 3: Sqlalchemy declaratif

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

Page 4: Sqlalchemy declaratif

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

Page 5: Sqlalchemy declaratif

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)

Page 6: Sqlalchemy declaratif

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éé

Page 7: Sqlalchemy declaratif

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)

Page 8: Sqlalchemy declaratif

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

Page 9: Sqlalchemy declaratif

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)

Page 10: Sqlalchemy declaratif

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

Page 11: Sqlalchemy declaratif

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’)

Page 12: Sqlalchemy declaratif

11

Questions

Page 13: Sqlalchemy declaratif

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