12
votes

SQLALCHEMY: Éviter la répétition dans la définition de classe de style déclaratif

J'utilise SQLalchemy, et de nombreuses classes de mon modèle d'objet ont les deux mêmes attributs: ID et (clé entière et principale) et nom (une chaîne). J'essaie d'éviter de les déclarer dans chaque classe comme si: xxx

Qu'est-ce qu'un bon moyen de le faire? J'ai essayé d'utiliser des métaclasses mais cela n'a pas encore fonctionné.


0 commentaires

3 Réponses :


14
votes

Vous pouvez facturer vos attributs communs dans un Classe MixIn < / a> et multiplier le hériter à côté de déclaratif_base () : xxx

edit : Vous pourriez penser que cela entraînerait une C1 et C2 Partage des mêmes objets COLONNE , mais comme indiqué dans le sqlalchemy docs , les objets de colonne sont copiés à partir d'une classe de mixine. J'ai mis à jour l'échantillon de code pour démontrer ce comportement.


2 commentaires

Malheureusement, cela ne va pas fonctionner car l'attribut d'identification serait alors partagé entre toutes les sous-classes de IDNAMEMIXIN. Dans SQLALCHÉMY, chaque classe doit avoir son propre identifiant (un objet nouvellement créé de la colonne de classe).


Ah très cool !! Merci. Maintenant, si seulement je pouvais faire quelque chose à propos du nom __ __ , ce qui doit certainement être unique :) Mais j'aime votre approche avec la classe Mixin mieux que ma modification de la métaclasse.



1
votes

Je pense que je l'ai eu pour travailler.

J'ai créé une métaclasse qui découle de la CRISTATIVEMÈME et a fait que la métaclasse de C1 et C2. Dans cette nouvelle métaclasse, j'ai simplement dit xxx

et il semble fonctionner correctement.


0 commentaires

2
votes

Pourriez-vous également utiliser la méthode de la copie de la colonne? De cette façon, les champs peuvent être définis indépendamment des tables et ces champs réutilisés ne sont que du champ. Copy () - Ed.

id = Column(Integer, primary_key = True)
name = Column(String)

class C1(declarative_base()):
    id = id.copy()
    name = name.copy()
    #...

class C2(declarative_base()):
    id = id.copy()
    name = name.copy()
    #...


1 commentaires

Quelqu'un sache comment modifier les propriétés de ces colonnes dans différentes classes de table, alors? C'est-à-dire que si l'identifiant n'est pas primaire en C1, mais est primaire en C2, comment faire cette distinction sans la répétition que nous évitons?