我有一個 SQLAlchemy VolunteerClient模型,它是一個連接表:
class VolunteerClient(Base):
__tablename__ = 'volunteer_client'
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
volunteer_id = Column(Integer, ForeignKey('provider_user.user_id', onupdate='CASCADE', ondelete='RESTRICT'), unique=True)
client_id = Column(Integer, ForeignKey('user.id', onupdate='CASCADE', ondelete='RESTRICT'), unique=True)
和一個VolunteerReport模型:
class VolunteerReport(Base):
__tablename__ = 'volunteer_report'
id = Column(Integer, primary_key=True, autoincrement=True, index=True)
volunteer_id = Column(Integer, ForeignKey('volunteer_client.volunteer_id', cascade="all, delete"))
client_id = Column(Integer, ForeignKey('volunteer_client.client_id', cascade="all, delete"))
report = Column(String(255), nullable=False)
report_category = Column(String(255), nullable=False)
如果我要洗掉一個VolunteerClient表,這實際上是從客戶那里取消分配志愿者,但實際上并沒有洗掉他們所代表的用戶。具有特定的志愿者ID和客戶端 ID集,
示例:我洗掉VolunteerClient表,其中:volunteer_id = 1,& client_id = 1,
我希望同時洗掉所有VolunteerReports,其中:volunteer_id = 1,& client_id = 1。我是否使用對志愿者_client 的 FK 參考和cascade='all, delete'?
任何建議都會很棒。
uj5u.com熱心網友回復:
要在洗掉父項時自動洗掉子行,您需要ondelete='CASCADE'在子表中定義的外鍵上進行設定。在這種情況下,外鍵是一個復合鍵,因為它由volunteer_id和組成client_id。這意味著您還需要對父級中的列進行唯一約束。您的模型的這個簡化版本顯示了它是如何作業的(我已經從VolunteerClient問題中定義的表中洗掉了 FK 定義)。
class VolunteerClient(Base):
__tablename__ = 'volunteer_client'
id = sa.Column(sa.Integer, primary_key=True)
volunteer_id = sa.Column(sa.Integer)
client_id = sa.Column(sa.Integer)
__table_args__ = (sa.UniqueConstraint(volunteer_id, client_id),)
class VolunteerReport(Base):
__tablename__ = 'volunteer_report'
id = sa.Column(sa.Integer, primary_key=True)
volunteer_id = sa.Column(sa.Integer)
client_id = sa.Column(sa.Integer)
__table_args__ = (
sa.ForeignKeyConstraint(
[volunteer_id, client_id],
[VolunteerClient.volunteer_id, VolunteerClient.client_id],
ondelete='CASCADE',
),
)
您還可以在 SQLAlchemy關系上配置洗掉級聯,這使您可以更好地控制洗掉父行時發生的情況。由于您似乎沒有使用關系,并且資料庫級聯可以執行您想要的操作,因此我不會在此答案中對此進行介紹。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/425144.html
標籤:Python 烧瓶 sqlalchemy
