Vous êtes ici : Accueil Tutoriels SQLAlchemy Polymorphisme

Polymorphisme

Petite introduction à la gestion du polymorphisme SQL avec SQLAlchemy

Le polymorphisme est une notion bien connue en programmation objet. Plutôt que de recourir à de trop nombreuses et récurrentes conditions, il faut mieux utiliser des objets spécialisés, lesquels disposent alors de méthodes communes et de spécialisations.

Il en est de même au niveau SQL et la déclaration du polymorphisme se fait très simplement, en déclarant d'où il vient et comment il est géré à travers l'écriture d'une classe de base et de plusieurs sous-classes :

class User(Base):
__tablename__ = 'auth_user'
__mapper_args__ = { 'polymorphic_on': 'role' }

id = Column(Integer, autoincrement=True, primary_key=True)
name = Column(Unicode(16), unique=True, nullable=False)
email_address = Column(Unicode(255), unique=True, nullable=False, info={'rum': {'field':'Email'}})
display_name = Column(Unicode(255))
_password = Column('password', Unicode(128), info={'rum': {'field':'Password'}})
created = Column(DateTime, default=datetime.now)

role = Column('role', Unicode(20), nullable=False)

class AdminUser(User):
__mapper_args__ = { 'polymorphic_identity': 'admin' }

class ManagerUser(User):
__mapper_args__ = { 'polymorphic_identity': 'manager' }

class BaseUser(User):
__mapper_args__ = { 'polymorphic_identity': 'base' }

Ainsi, la création d'un objet User, sans préciser de rôle échouera :

u1 = User()

Voici la requête générée :

auth_user.role may not be NULL 'INSERT INTO auth_user

Alors que la création d'un objet spécialisé fonctionnera correctement :

u1 = AdminUser()

Voici la requête générée :

INSERT INTO auth_user (name, email_address, display_name, password, created, role) VALUES (?, ?, ?, ?, ?, ?)
INFO:sqlalchemy.engine.base.Engine:('u1', 'u1@inspyration.org', 'user 1', None, '2013-02-08 12:12:44.047844', 'admin')

Il ne reste plus qu'à rajouter aux bons endroits, c'est à dire dans les bonnes classes, les champs spécialisés, c'est à dire ceux qui ne s'appliquent qu'à un type d'utilisateur données.

Voici quelle est l'instruction de création de la table :

CREATE TABLE auth_user (
id INTEGER NOT NULL,
name VARCHAR(16) NOT NULL,
email_address VARCHAR(255) NOT NULL,
display_name VARCHAR(255),
password VARCHAR(128),
created DATETIME,
role VARCHAR(20) NOT NULL,
PRIMARY KEY (id),
UNIQUE (name),
UNIQUE (email_address)
)

Les champs spécialisés viendront alors se rajouter, mais ne seront lus et gardés de manière persistante que dans le cas où ils sont déclarés dans le modèle spécialisé correspondant.

Mots-clés associés : , ,
Spinner