SQLAlchemy, borre el contenido de la base de datos pero no suelte el esquema

Estoy desarrollando una aplicación de Pylons que se basa en la base de datos existente, así que estoy usando la reflexión. Tengo un archivo SQL con el esquema que usé para crear mi base de datos de prueba. Es por eso que simplemente no puedo usar drop_all y create_all .

Me gustaría escribir algunas pruebas unitarias y enfrenté el problema de borrar el contenido de la base de datos después de cada prueba. Solo quiero borrar todos los datos pero dejar las tablas intactas. es posible?

La aplicación utiliza Postgres y esto es lo que debe usarse también para las pruebas.

Pregunté sobre lo mismo en el grupo de Google SQLAlchemy, y obtuve una receta que parece funcionar bien (todas mis tablas están vacías). Vea el hilo para referencia.

Mi código (extracto) se ve así:

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

Edición: modifiqué el código para borrar tablas en orden inverso; supuestamente esto debería asegurar que los niños sean eliminados antes que los padres.

Para PostgreSQL utilizando 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() 

Nota: RESTART IDENTITY; asegura que todas las secuencias se reinician también. Sin embargo, esto es más lento que la receta DELETE by @ aknuds1 en un 50%.

Otra receta es eliminar primero todas las tablas y luego recrearlas. Esto es más lento en otro 50%:

 Base.metadata.drop_all(bind=engine) Base.metadata.create_all(bind=engine) 

¿Qué hay de usar Truncate?

TRUNCATE [TABLE] nombre [, …]

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

Esto eliminará todos los registros de la tabla, pero dejará el esquema intacto.