python - query - sqlalchemy sqlite
SQLAlchemy, borre el contenido de la base de datos pero no suelte el esquema (3)
Estoy desarrollando una aplicación de Pylons que se basa en una 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 no puedo simplemente 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.
¿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.
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)
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.