我有几张表,下面是多到多的关系
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行?
谢谢
发布于 2021-03-11 13:23:59
如果您想要删除表中的所有行,那么使用TRUNCATE就会更快,这只是删除磁盘上的表文件,而不是逐个删除每一行。它还将回收磁盘空间,与DELETE不同,DELETE只会在表文件中创建空闲空间。
如果有外键:
可以截断引用表(TableTwo)。
但是您不能截断引用的表,因为这会破坏外键引用。但是,如果要删除引用和引用表中的所有行,只需截断这两个行:
TRUNCATE table1, table2;如果引用和引用表在相同的truncate命令中列出,它将工作。不要使用两个独立的截断命令,否则postgres将拒绝破解外键(这是应该的!)
注如果希望table1中的行删除也删除table2中的引用行,则必须将外键设置为"ON delete级联“。然后您可以在table1上使用DELETE,但是删除所有行截断要快得多。
https://stackoverflow.com/questions/66579327
复制相似问题