SQLAlchemy清除数据库内容,但不要删除该模式

我正在开发基于现有数据库的Pylons应用程序,所以我正在使用reflection。 我有一个SQL文件与我用来创build我的testing数据库的架构。 这就是为什么我不能简单地使用drop_allcreate_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,但保留模式。