![](/img/trans.png)
[英]SQLAlchemy one-to-many relationship - how to properly get the 'many' collection
[英]How to map one-to-many relationship on sqlalchemy
我正在學習 Flask+sqlalchemy,但在使用 ORM 時遇到了一些問題。 我有一個 model.py 有一個class House
和一個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 表。 我覺得很簡單,在member
表上有一個house_id
作為外鍵('house.id')就足夠了,並且member_mapper
必須是這樣的:
member_mapper = mapper(
model.Member,
member,
properties={'house': relationship(house_mapper)
})
但是如果我理解正確的話, properties
字典上的鍵(上面代碼中的house
)必須是被映射的類的屬性。 在我的情況下, house
不是member
類的屬性。
我在這里出了什么問題?
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')),
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.