我正在开发一个基于exisitng数据库的Pylons应用程序,所以我正在使用反射。我有一个SQL文件,其中包含我用来创建测试数据库的模式。这就是为什么我不能简单地使用drop_all
和create_all
。
我想写一些单元测试,我遇到了每次测试后清除数据库内容的问题。我只想删除所有数据,但保持表格完好无损。这可能吗?
该应用程序使用Postgres,这也是必须用于测试的内容。
答案 0 :(得分:47)
我在SQLAlchemy Google小组上询问了同样的事情,我得到了一个似乎运作良好的食谱(我的所有表都被清空了)。请参阅the thread以供参考。
我的代码(摘录)如下所示:
import contextlib
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()
编辑:我修改了代码,以相反的顺序删除表格;据说这应该确保在父母面前删除孩子。
答案 1 :(得分:12)
对于使用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%。
另一个方法是首先删除所有表,然后重新创建它们。这又慢了50%:
Base.metadata.drop_all(bind=engine)
Base.metadata.create_all(bind=engine)
答案 2 :(得分:-2)
如何使用truncate:
TRUNCATE [TABLE] name [,...]
(http://www.postgresql.org/docs/8.4/static/sql-truncate.html)
这将删除表中的所有记录,但保留架构。