没有存根类的SQLAlchemy关系

时间:2017-12-22 22:59:42

标签: python sqlalchemy

我目前正在关注以下情况 -

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

Personality对象只有一个值(与典型对象不同,这些值被硬编码到代码库中)。我想知道是否有某种方法可以实现这种相同的关系行为,而没有一个封装了个性的显式存根表。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我太好奇了如何定义一个非基于表的" selectable" sqlalchemy中的类并将其用作映射器,这是一个替代实现,用于将个性值放入枚举列中:

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}>'

你可以像以下一样使用它:

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