簡體   English   中英

如何在 sqlalchemy 上映射一對多關系

[英]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 屬性、 membershouse都應該由 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM