SQLAlchemy,清除数据库内容但不删除架构

时间:2011-01-21 20:30:43

标签: python sqlalchemy pylons

我正在开发一个基于exisitng数据库的Pylons应用程序,所以我正在使用反射。我有一个SQL文件,其中包含我用来创建测试数据库的模式。这就是为什么我不能简单地使用drop_allcreate_all

我想写一些单元测试,我遇到了每次测试后清除数据库内容的问题。我只想删除所有数据,但保持表格完好无损。这可能吗?

该应用程序使用Postgres,这也是必须用于测试的内容。

3 个答案:

答案 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

这将删除表中的所有记录,但保留架构。