【问题标题】:How to clean the database, dropping all records using sqlalchemy?如何清理数据库,使用 sqlalchemy 删除所有记录?
【发布时间】:2017-06-21 21:04:40
【问题描述】:

我正在使用 SQLAlchemy。我想有效地删除数据库中存在的所有记录,但我不想删除表/数据库。

我尝试了以下代码。

con = engine.connect()
trans = con.begin()

con.execute(table.delete())
trans.commit()

看起来,这不是一个非常有效的方法,因为我正在遍历数据库中存在的所有表。 有人可以建议我更好更有效的方法吗?

这里非常感谢任何形式的帮助。

【问题讨论】:

  • 对于某些数据库存在“截断”语句。它重新创建表并更快地工作而不是事务性的。您可以使用 engine.execute('''truncate tablename''') 使用原始 SQL 执行它
  • @Varela 感谢您分享您的想法,我想以适用于所有数据库的方式编写方法/函数。因为truncate 依赖于数据库,所以它不是我的首选。
  • 那么没有比这更好的了,你不能省略遍历表并删除可能唯一适用于所有数据库的语句。
  • metadata.drop_all() 然后metadata.create_all() 有什么问题

标签: python sqlalchemy


【解决方案1】:

如果您的模型依赖于现有的 DB 架构(通常使用 autoload=True),则无法避免删除每个表中的数据。 MetaData.sorted_tables 派上用场:

for tbl in reversed(meta.sorted_tables):
    engine.execute(tbl.delete())

如果您的模型确实定义了完整的架构,那么没有什么比 drop_all/create_all 更简单的了(正如 @jadkik94 已经指出的那样)。

此外,TRUNCATEForeignKeys 引用的表上无论如何都不起作用,这大大限制了使用。

【讨论】:

  • 嗨。由于某种原因,我的 meta.tablesmeta.sorted_tables 是一个空列表。我有meta = sqlalchemy.MetaData(bind=engine)。为什么数据库有表时显示为空?
  • 如果您没有定义绑定到此meta 的模型,则不会有任何东西。但是如果你不想定义模型,并且想从数据库中reflect他们,你需要先调用MetaData.reflect
  • 哇,感谢您的帮助!再问一个问题,如果你不介意的话。现在要获取表实例,我可以使用meta.tables['tasks'],但这意味着我必须记住类名 (Tasks) 和表名“任务”。有什么办法可以避免吗?
  • 我不确定你是从正确的角度来处理这个问题的。但是请看一下Using Reflection with DeclarativeDeclarative Reflection 的例子。这些应该让您了解如何只定义没有表的模型类。
  • 感谢您指出正确的方向。我需要的是session.query(Tasks).delete()
【解决方案2】:

对我来说,tbl.drop(engine) 有效,但 engine.execute(tbl.delete()) 无效

SQLAlchemy 0.8.0b2 和 Python 2.7.3

【讨论】:

    猜你喜欢
    • 2021-11-24
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    相关资源
    最近更新 更多