使用ORM的SqlAlchemy如何截断表

15

我一直在为我的应用程序使用orm,并尽量避免使用sql,以避免在不同的dbms之间更改时出现sql语法错误。

目前我正在测试sqlite和mysql。 我发现要删除表,我们可以使用:

db.session.query(models.MyTable).delete()

不幸的是,这种方法并没有真正“清空”表,因为它没有将自增计数器重置为0。

是否有办法在SqlAlchemy orm中执行真正的truncate操作?


1
需要重置序列是可疑的,你为什么想要这样做? - SingleNegationElimination
我希望在sqlite和mysql之间有相同的行为,因为似乎对于sqlite来说计数器会被重置,而mysql则不会。 - w00d
重置序列更多地是SQLite序列实现的缺陷,我认为这是一个错误! - SingleNegationElimination
7
有时人们会将开发数据放入数据库进行测试,然后想要删除表格并重新开始。在我看来,这是重置计数器的合理时间。就像重新开始一样。 - Jonathan
2个回答

3

SQLAlchemy的delete(...)方法被翻译为SQL的DELETE FROM查询。这个查询不会重置任何AUTO_INCREMENT计数器。要在MySQL中重置计数器,你需要运行像这样的查询:

ALTER TABLE tbl AUTO_INCREMENT = 100;

如果我没有搞错的话,这在SQLAlchemy中是没有类似物的。

2

由于没有truncate()操作,SQLAlchemy中删除表中所有条目并重置自增计数的简单解决方法是像这样删除并重新创建表:

Base.metadata.drop_all(engine, tables=[YourTable.__table__])
Base.metadata.create_all(engine, tables=[YourTable.__table__])

(针对删除表的替代SQLAlchemy语法示例,请查看stackoverflow post。)

1
这将删除表(包括它们的模式),这会更慢。如果我错了,请纠正我。 - Ramon Dias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接