SQLAlchemy清除数据库内容,但不要删除该模式
我正在开发基于现有数据库的Pylons应用程序,所以我正在使用reflection。 我有一个SQL文件与我用来创build我的testing数据库的架构。 这就是为什么我不能简单地使用drop_all
和create_all
。
我想写一些unit testing,并且在每次testing之后,我都遇到了清除数据库内容的问题。 我只是想删除所有的数据,但保持完整的表。 这可能吗?
应用程序使用Postgres,这也是必须使用的testing。
我在SQLAlchemy的Google小组上询问了同样的事情,而且我看到了一个看起来很好的配方(我所有的表都被清空了)。 请参阅线程以供参考。
我的代码(摘录)看起来像这样:
from sqlalchemy import MetaData meta = MetaData() with contextlib.closing(engine.connect()) as con: trans = con.begin() for table in reversed(meta.sorted_tables): con.execute(table.delete()) trans.commit()
编辑:我修改了代码以相反的顺序删除表; 据说这应该确保孩子在父母面前被删除。
对于使用TRUNCATE
PostgreSQL:
with contextlib.closing(engine.connect()) as con: trans = con.begin() con.execute('TRUNCATE {} RESTART IDENTITY;'.format( ','.join(table.name for table in reversed(Base.metadata.sorted_tables)))) trans.commit()
注意: RESTART IDENTITY;
确保所有序列都被重置。 但是,这比@ aknuds1的DELETE
配方慢了50%。
另一个方法是首先删除所有表,然后重新创build它们。 这比另外50%还要慢
Base.metadata.drop_all(bind=engine) Base.metadata.create_all(bind=engine)
如何使用截断:
TRUNCATE [TABLE] name [,…]
( http://www.postgresql.org/docs/8.4/static/sql-truncate.html )
这将删除表中的所有logging,但保留模式。