【问题标题】:Deleting millions of rows with Many-To-Many Relationship SQLAlchemy使用多对多关系 SQLAlchemy 删除数百万行
【发布时间】:2021-06-09 06:09:36
【问题描述】:

我有几个表具有以下多对多关系

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,
    ),
)

一般我都是做小项目的,可以删除所有的关系如下

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 行?

谢谢

【问题讨论】:

    标签: python-3.x postgresql sqlalchemy


    【解决方案1】:

    如果您想删除表中的所有行,使用 TRUNCATE 会快得多,它只是将磁盘上的表文件丢弃,而不是逐行删除。它还会回收磁盘空间,不像 DELETE 只会在表文件中创建空闲空间。

    如果有外键:

    您可以截断引用表(TableTwo)。

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

    TRUNCATE table1, table2;
    

    如果引用表和被引用表列在同一个 truncate 命令中,它将起作用。不要使用两个独立的 TRUNCATE 命令,否则 postgres 将拒绝破坏你的外键(它应该这样做!)。

    请注意,如果您希望 table1 中的行删除也删除 table2 中的引用行,则必须将外键设置为“ON DELETE CASCADE”。然后你可以在 table1 上使用 DELETE,但是删除所有行 TRUNCATE 要快得多。

    【讨论】:

    • 我不想删除这两个表。只有一个表,然后是另一个表的关系。我特别询问是否有 SQLalchemy 解决方案而不是原始 postgresql,但如果没有,那么我认为删除级联可能会起作用。
    • 我不明白什么是“只有一个表,然后是另一个表的关系”,但如果你只想截断引用表,那么你可以。我已经更新了答案。
    • 谢谢,这成功了。我只是指引用表。
    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2015-05-03
    • 2016-08-06
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多