首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除具有多到多关系SQLAlchemy的数百万行

删除具有多到多关系SQLAlchemy的数百万行
EN

Stack Overflow用户
提问于 2021-03-11 09:04:02
回答 1查看 94关注 0票数 0

我有几张表,下面是多到多的关系

代码语言:javascript
运行
复制
def TableOne(db.Model):
    __tablename__ = "table_one"
    id = db.Column(db.Integer, primary_key=True)
    table_twos = db.relationship(
        "TableTwo", secondary=relationship_table, lazy="subquery"
    )
    # Some other attributes

def TableTwo(db.Model):
    __tablename__ = "table_two"
    id = db.Column(db.Integer, primary_key=True)

relationship_table = db.Table(
    "relationship_table",
    db.Column("table_one_id", db.Integer, db.ForeignKey("table_one.id"), primary_key=True),
    db.Column(
        "table_two_id",
        db.Integer,
        db.ForeignKey("table_two.id"),
        primary_key=True,
    ),
)

通常,我从事小型项目,我可以删除所有的关系,如下所示

代码语言:javascript
运行
复制
tables = db.session.query(TableOne).all()
for t in tables:
    t.table_twos = []
    db.session.flush()
db.session.commit()

table_twos = db.session.query(TableTwo).all()
for t in table_twos:
    db.session.delete(t)
    db.session.flush()
db.session.commit()

但是,由于我正在处理数百万行,所以无法将它们全部加载到内存中。如果我尝试删除所有的TableTwo行,它会给我一个关于外键的错误。

如何一次性删除所有关系,然后一次性删除TableTwo行?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-11 13:23:59

如果您想要删除表中的所有行,那么使用TRUNCATE就会更快,这只是删除磁盘上的表文件,而不是逐个删除每一行。它还将回收磁盘空间,与DELETE不同,DELETE只会在表文件中创建空闲空间。

如果有外键:

可以截断引用表(TableTwo)。

但是您不能截断引用的表,因为这会破坏外键引用。但是,如果要删除引用和引用表中的所有行,只需截断这两个行:

代码语言:javascript
运行
复制
TRUNCATE table1, table2;

如果引用和引用表在相同的truncate命令中列出,它将工作。不要使用两个独立的截断命令,否则postgres将拒绝破解外键(这是应该的!)

注如果希望table1中的行删除也删除table2中的引用行,则必须将外键设置为"ON delete级联“。然后您可以在table1上使用DELETE,但是删除所有行截断要快得多。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66579327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档