没有存根类的SQLAlchemy关系

问题描述 投票:1回答:1

我目前正在考虑以下情况 -

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对象只有一个值(这些值被硬编码到代码库中,与典型对象不同)。我想知道是否有某种方法来实现这种相同的关系行为,而没有一个封装了个性的显式存根表。有任何想法吗?

python sqlalchemy
1个回答
0
投票

我太好奇了如何在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))
© www.soinside.com 2019 - 2024. All rights reserved.