SqlAlchemy 用 ORM 截断表

Posted

技术标签:

【中文标题】SqlAlchemy 用 ORM 截断表【英文标题】:SqlAlchemy truncate table with ORM 【发布时间】:2012-11-28 15:04:42 【问题描述】:

我的应用一直使用orm,尽量不要使用sql,避免不同dbms之间切换时出现sql语法错误。

目前我正在使用 sqlite 和 mysql 进行测试。我想删除一个我们可以使用的表:

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

不幸的是,这种方法并没有真正“截断”表,因为它不会将自动增量的计数重置为 0。

有没有办法在 SqlAlchemy orm 中进行真正的截断?

【问题讨论】:

需要重新设置序列是可疑的,你为什么要这个? 我希望 sqlite 和 mysql 之间有相同的行为,因为对于 sqlite,计数器似乎已重置,而 mysql 则没有。 重置序列更多是sqlite序列实现的缺陷,我认为是bug! 有时人们出于测试目的将开发数据放入数据库中,然后想要截断表并再次执行此操作。对我来说,这是重置计数器的合理时间。这就像一个“重做” 【参考方案1】:

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 语法示例,请查看*** post)

【讨论】:

以上是关于SqlAlchemy 用 ORM 截断表的主要内容,如果未能解决你的问题,请参考以下文章

在 SqlAlchemy ORM 中填充相关表

python postgresql orm 截断表

截断表不适用于 SQL Server sqlalchemy 引擎和 pandas

了解 SQLAlchemy

Python SQLalchemy的学习与使用

使用sqlalchemy用orm方式写pipeline将scrapy item快速存入 MySQL