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