Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 使用多对多关系SQLAlchemy删除数百万行_Python 3.x_Postgresql_Sqlalchemy - Fatal编程技术网

Python 3.x 使用多对多关系SQLAlchemy删除数百万行

Python 3.x 使用多对多关系SQLAlchemy删除数百万行,python-3.x,postgresql,sqlalchemy,Python 3.x,Postgresql,Sqlalchemy,我有几个表,它们具有以下多对多关系 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&quo

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

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

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

如何一次删除所有关系,然后一次删除两行表格


谢谢

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

如果存在外键:

您可以截断引用表(表二)

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

TRUNCATE table1, table2;
如果引用和引用的表列在同一个truncate命令中,则该命令将起作用。不要使用两个独立的TRUNCATE命令,否则postgres将拒绝断开您的外键(这是应该的!)


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

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

如果存在外键:

您可以截断引用表(表二)

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

TRUNCATE table1, table2;
如果引用和引用的表列在同一个truncate命令中,则该命令将起作用。不要使用两个独立的TRUNCATE命令,否则postgres将拒绝断开您的外键(这是应该的!)


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

我不想同时删除这两个表。只有一个表,然后是另一个表中的关系。我特别询问是否有SQLalchemy解决方案,而不是原始postgresql,但如果没有,那么我认为删除级联可能会起作用。我不明白什么是“只有一个表,然后是来自另一个表的关系”,但如果您只想截断引用表,那么您可以。我已经更新了答案。谢谢,这很有效。我只是指引用表。我不想同时删除这两个表。只有一个表,然后是另一个表中的关系。我特别询问是否有SQLalchemy解决方案,而不是原始postgresql,但如果没有,那么我认为删除级联可能会起作用。我不明白什么是“只有一个表,然后是来自另一个表的关系”,但如果您只想截断引用表,那么您可以。我已经更新了答案。谢谢,这很有效。我只是指参考表。