2009-12-31 8 views
6

Je souhaite représenter un type de données en tant que colonne unique dans mon modèle, mais les données seront réellement stockées dans plusieurs colonnes de la base de données. Je ne peux pas trouver de bonnes ressources sur la façon de le faire dans SQLAlchemy.Type personnalisé SQLAlchemy qui contient plusieurs colonnes

Je voudrais que mon modèle pour ressembler à ceci (ceci est un exemple simplifié en utilisant la géométrie au lieu de mon vrai problème qui est plus difficile à expliquer):

class 3DLine(DeclarativeBase): 
    start_point = Column(my.custom.3DPoint) 
    end_point = Column(my.custom.3DPoint) 

De cette façon, je pourrais assigner un objet avec le (x, y, z) composants du point à la fois sans les régler individuellement. Si je devais séparer chaque composant, cela pourrait devenir moche, surtout si chaque classe a plusieurs de ces objets composites. Je combinerais les valeurs dans un champ codé, sauf que j'ai besoin d'interroger chaque valeur séparément à la fois. J'ai pu trouver comment faire des types personnalisés en utilisant une seule colonne in the documentation. Mais rien n'indique que je puisse mapper un seul type à plusieurs colonnes. Je suppose que je pourrais accomplir cela en utilisant une table séparée, et chaque colonne serait une clé étrangère, mais dans mon cas, je ne pense pas qu'il soit logique d'avoir un mappage un à un pour chaque point à un autre table, et cela ne donne toujours pas la possibilité de définir les valeurs connexes tout à la fois.

Répondre

7

Voici un exemple minimal basé sur documentation:

class 3DPoint(object): 
    def __init__(self, x, y, z): 
     self.x = x 
     self.y = y 
     self.z = z 

    def __composite_values__(self): 
     return (self.x, self.y, self.z) 

class 3DLine(DeclarativeBase): 
    start_point = sqlalchemy.orm.composite(
     3DPoint, 
     Column('start_point_x', Integer, nullable=False), 
     Column('start_point_y', Integer, nullable=False), 
     Column('start_point_z', Integer, nullable=False), 
    ) 
+0

C'est idéal pour un usage unique, mais cette approche ne permet pas de factoriser comme un type distinct, dans des cas comme ci-dessus quand il sont deux champs composites du même type (start_point et end_point) - il y aura duplication des noms de colonnes. Est-il possible d'utiliser l'inférence automatique des noms de colonne qui fonctionne pour les champs à une colonne, et d'y ajouter "_x", "_y" et "_z"? (Meta: dois-je poser une question séparée sur SO à ce sujet?) – Veky

Questions connexes