SQLAlchemy, очистить содержимое базы данных, но не отбрасывать схему - PullRequest
46 голосов
/ 21 января 2011

Я занимаюсь разработкой приложения Pylons, основанного на существующей базе данных, поэтому использую рефлексию. У меня есть файл SQL со схемой, которую я использовал для создания своей тестовой базы данных. Вот почему я не могу просто использовать drop_all и create_all.

Я хотел бы написать несколько юнит-тестов и столкнулся с проблемой очистки содержимого базы данных после каждого теста. Я просто хочу стереть все данные, но оставить таблицы нетронутыми. Возможно ли это?

Приложение использует Postgres, и это то, что нужно использовать и для тестов.

Ответы [ 3 ]

47 голосов
/ 15 февраля 2011

Я спросил об этом в группе Google SQLAlchemy и получил рецепт, который, кажется, работает хорошо (все мои таблицы опустошены). См. тему для справки.

Мой код (выдержка) выглядит так:

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()

Редактировать: я изменил код для удаления таблиц в обратном порядке; предположительно, это должно гарантировать, что дети будут удалены раньше родителей.

12 голосов
/ 09 августа 2014

Для PostgreSQL используется TRUNCATE:

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; гарантирует, что все последовательности также сбрасываются. Однако это медленнее, чем рецепт DELETE от @ aknuds1 на 50%.

Другой рецепт - сначала убрать все таблицы, а затем воссоздать их. Это на 50% медленнее:

Base.metadata.drop_all(bind=engine)
Base.metadata.create_all(bind=engine)
0 голосов
/ 21 января 2011

Как насчет использования усечения:

TRUNCATE [TABLE] name [, ...]

(http://www.postgresql.org/docs/8.4/static/sql-truncate.html)

Это удалит все записи в таблице, но оставьте схему в такте.

...