【问题标题】:How to cascade delete from parent using alembic?如何使用alembic从父级级联删除?
【发布时间】:2021-11-23 01:22:14
【问题描述】:

也许我在这里遗漏了一些超级简单的东西,但我有一个 postgresql 数据库,它有几个这样的表:

- releases
 |- releases_contributions
 |- releases_primary contributions
 |- recording
   |- recording_contributions
   |- recording_primary_contributions

其中releases_contributionsreleases_primary_contributionsrecording 都有一个列,其外键与自动生成的releases_id 相关联。

我已经进行了修改以更新ondelete 参数:

    op.alter_column('recording', 'releases_id', sa.ForeignKey('releases.releases_id', ondelete='CASCADE'))
    op.alter_column('recording_contributions', 'recording_fk_id', sa.ForeignKey('recording.recording_id', ondelete='CASCADE'))
    op.alter_column('recording_primary_contributions', 'recording_fk_id', sa.ForeignKey('recording.recording_id', ondelete='CASCADE'))
    op.alter_column('releases_contributions', 'releases_fk_id', sa.ForeignKey('releases.releases_id', ondelete='CASCADE'))
    op.alter_column('releases_primary_contributions', 'releases_fk_id', sa.ForeignKey('releases.releases_id', ondelete='CASCADE'))

当然,在我最初的 alembic 升级中,我有这个:

op.add_column('releases', 'releases_id', primary_key=True, autoincrement=True)

我正在尝试删除releases 中的一行

delete from releases where releases_id=1;

然后级联到其他表并删除任何具有该版本的行,因为它是外键。

但是每当我运行该命令时,我都会收到以下错误:

ERROR:  update or delete on table "releases" violates foreign key constraint "releases_contributions_releases_fk_id_fkey" on table "releases_contributions"
DETAIL:  Key (releases_id)=(1) is still referenced from table "releases_contributions".

我在这里错过了什么?

【问题讨论】:

  • 不幸的是,这不是解决方案

标签: python postgresql alembic


【解决方案1】:

使用以下降级/升级更新 alembic 修订版,然后运行 ​​alembic downgrade -1alembic upgrade head 修复了此问题。

def upgrade():
    op.alter_column('recording', 'releases_id', sa.ForeignKey('releases.releases_id', ondelete='CASCADE'))
    op.alter_column('recording_contributions', 'recording_fk_id', sa.ForeignKey('recording.recording_id', ondelete='CASCADE'))
    op.alter_column('recording_primary_contributions', 'recording_fk_id', sa.ForeignKey('recording.recording_id', ondelete='CASCADE'))
    op.alter_column('releases_contributions', 'releases_fk_id', sa.ForeignKey('releases.releases_id', ondelete='CASCADE'))
    op.alter_column('releases_primary_contributions', 'releases_fk_id', sa.ForeignKey('releases.releases_id', ondelete='CASCADE'))


def downgrade():
    op.drop_contraint('releases_id', 'releases')
    op.drop_contraint('releases_id', 'recording')
    op.drop_contraint('releases_fk_id', 'releases_contributions')
    op.drop_contraint('releases_fk_id', 'releases_primary_contributions')
    op.drop_contraint('recording_fk_id', 'recording_contributions')
    op.drop_contraint('recording_fk_id', 'recording_primary_contributions')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2011-03-22
    相关资源
    最近更新 更多