2017-12-22 5 views
1

Ich bin derzeit in einer Situation wie die Suche folgender -SQLAlchemy Beziehung ohne Stub-Klasse

user_association = Table('user_association', Base.metadata, 
    Column('user_id', UUIDType, ForeignKey('user.id')), 
    Column('personality_id', UUIDType, ForeignKey('personality.id')) 
) 

class User(Base, DBBase): 
    __tablename__ = 'user' 
    id = Column(Integer, primary_key = True) 
    name = Column(String), nullable = True) 

    personalities = relationship(
     "Personality", 
     secondary=user_association, 
     back_populates="users" 
    ) 

class Personality(Base, DBBase): 
    __tablename__ = 'personality' 

    id = Column(Integer, primary_key = True) 
    value = Column(String, nullable = True) 

    users = relationship(
     "User", 
     secondary=user_association, 
     back_populates="personalities" 
    ) 

Das Personality Objekt hat nur einen Wert (und diese Werte sind hartcodiert in die Code-Basis, im Gegensatz zu typischen Objekten) . Ich frage mich, ob es eine Möglichkeit gibt, dasselbe Beziehungsverhalten ohne eine explizite Stub-Tabelle zu erreichen, die die Persönlichkeit kapselt. Irgendwelche Ideen?

+0

nicht klar, mit was wollen Sie erreichen, ersetzen 'Personality' Tabelle mit einem python dict? Wie viele Datensätze in dieser Tabelle? – georgexsh

+0

@georgexsh Idealerweise möchte ich den "Benutzer" mit mehreren Persönlichkeitsstrings verbinden, während das eingebaute Verhalten von sqlalchemy beibehalten wird (wie das Hinzufügen neuer Werte mit .append). –

+0

@p-freeman wie viele * einzigartige * Werte von Persönlichkeiten dann? – georgexsh

Antwort

0

Ich auch neugierig, wie eine nicht-Tabelle basiert „wählbar“ Klasse in sqlalchemy definieren und sie als Mapper verwenden, hier ist eine alternative Implementierung, Persönlichkeitswerte in eine ENUM-Spalte zu setzen:

import enum 
from sqlalchemy_utils import ChoiceType 

class PersonalityEnum(enum.IntEnum): 
    I = 0 
    N = 1 
    T = 2 
    J = 3 

class User(Base): 
    __tablename__ = 'user' 

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

    personalities = relationship(
     "UserPersonality", 
     back_populates="users" 
    ) 

class UserPersonality(Base): 
    __tablename__ = 'user_personality' 

    user_id = Column(Integer, ForeignKey('user.id')) 
    personality = Column(ChoiceType(PersonalityEnum, impl=Integer())) 
    __table_args__ = (
     PrimaryKeyConstraint('user_id', 'personality'), 
    ) 

    users = relationship("User") 

    def __init__(self, p): 
     super().__init__(personality=p) 

    def __repr__(self): 
     return f'<UserPersonality user {self.user_id}, personality {self.personality.name}>' 

Sie könnten es mögen verwenden:

u = User(id=0, name='Guido van Rossum') 
u.personalities.append(UserPersonality(PersonalityEnum.I)) 
u.personalities.append(UserPersonality(PersonalityEnum.J)) 
Verwandte Themen