tutorial query example espaƱol create python sqlalchemy pylons

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.



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.