我正在學習 Flask sqlalchemy,但在使用 ORM 時遇到了一些問題。我有一個具有 aclass House和 a的 model.py class Member。
class House:
def __init__(self, members: typing.Set['Member'] = None) -> None:
if not patients:
self.member = set()
else:
self.member = set(member)
def add_member(self, person: 'Patient'):
self.patients.add(person)
def remove_member(self, patient: 'Member'):
self.member.remove(patient)
class Member:
def __init__(self, first_name: str, email: str, phone: str, age: int, gender: str, last_name=None) -> None:
self.first_name = first_name
self.last_name = last_name
self.email = email
self.phone = phone
self.age = age
self.gender = gender
def __hash__(self) -> int:
return hash(self.email)
def __eq__(self, other):
if isinstance(other, Patient):
return self.email == other.email
return NotImplemented
在orm.py我有:
house = Table(
'house', metadata,
Column('id', INTEGER, primary_key=True, autoincrement=True)
)
member = Table(
'patient', metadata,
Column('id', INTEGER, primary_key=True, autoincrement=True),
Column('first_name', String(255)),
Column('last_name', String(255)),
Column('email', String(255)),
Column('phone', String(255)),
Column('age', INTEGER),
Column('gender', String(255)),
member_allocation = Table(
'patient_allocation', metadata,
Column('id', INTEGER, primary_key=True, autoincrement=True),
Column('member_id', ForeignKey('member.id')),
Column('house_id', ForeignKey('house.id')),
)
def start_mappers():
member_mapper = mapper(model.Member,member)
house_mapper = mapper(
model.House,
house,
properties={
'members': relationship(
member_mapper,
secondary=member_allocation,
collection_class=set,
backref=backref('house')),
})
一個房子可以有很多成員,一個成員只能有一個房子。我覺得我不需要 member_allocation 表。我覺得很簡單,house_id在member桌子上有一個作為外鍵('house.id')就足夠了,而且member_mapper必須是這樣的:
member_mapper = mapper(
model.Member,
member,
properties={'house': relationship(house_mapper)
})
但是如果我理解正確的話,字典house上的鍵(在上面的代碼中)properties必須是被映射的類的屬性。在我的情況下house不是member類的屬性。
我在這里出了什么問題?
uj5u.com熱心網友回復:
該backref性能,members并且house都應該創建和SQLAlchemy的填充。
你是對的,如果每個成員只能有一個房子,那么你不需要關聯表(因為它是one2many)。您需要該表用于many2many。您應該能夠執行以下操作(將house_id列移至成員表):
def start_mappers():
member_mapper = mapper(model.Member,member)
house_mapper = mapper(model.House,
house,
properties={
'members': relationship(
member_mapper,
collection_class=set,
backref=backref('house')),
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/352640.html
