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,但如果没有,那么我认为删除级联可能会起作用。我不明白什么是“只有一个表,然后是来自另一个表的关系”,但如果您只想截断引用表,那么您可以。我已经更新了答案。谢谢,这很有效。我只是指参考表。