2012-06-27 15 views
19

Estoy usando SQlAlchemy. Quiero eliminar todos los registros presentes de forma eficiente en la base de datos, pero no quiero eliminar la tabla/base de datos.Cómo limpiar la base de datos, descartando todos los registros usando sqlalchemy?

He intentado con el siguiente código.

con = engine.connect() 
trans = con.begin() 

con.execute(table.delete()) 
trans.commit() 

Parece que no es muy eficiente ya que estoy iterando sobre toda la tabla presente en la base de datos. ¿Puede alguien sugerirme la forma mejor y más eficiente de hacer esto?

Cualquier tipo de ayuda muy apreciada aquí.

+0

Para algunas bases de datos 'truncar' comunicado. Recrea la tabla y funciona más rápido y no transaccional. Puede ejecutarlo con SQL sin procesar con engine.execute ('' 'truncate tablename' '') – varela

+0

@Varela Gracias por compartir sus pensamientos Quiero escribir el método/función de tal manera que funcione en todas las bases de datos. Dado que 'truncado' depende de DB, no sería mi primera opción. – Rakesh

+1

Entonces no hay nada mejor, no puede omitir iterar a través de tablas y eliminar probablemente la única declaración que funciona para todos los DB. – varela

Respuesta

22

Si sus modelos se basan en el esquema de base de datos existente (generalmente use autoload=True), no puede evitar borrar datos en cada tabla. MetaData.sorted_tables viene muy bien:

for tbl in reversed(meta.sorted_tables): 
    engine.execute(tbl.delete()) 

Si sus modelos hacen definir el esquema completo, no hay nada más sencillo que drop_all/create_all (como ya se ha señalado por @ jadkik94).

Además, TRUNCATE de todos modos no funcionaría en las tablas a las que hace referencia el ForeignKeys, que está limitando significativamente el uso.

+0

Hola. mi 'meta.tables' o' meta.sorted_tables' es una lista vacía por alguna razón. Tengo 'meta = sqlalchemy.MetaData (bind = engine)'. ¿Por qué se muestra vacío mientras que la base de datos tiene tablas? –

+1

Si no tiene modelos definidos vinculados a este 'meta', no habría nada. Pero si no desea definir modelos y desea 'reflejarlos 'desde la base de datos, debe llamar a [' MetaData.reflect'] (http://docs.sqlalchemy.org/en/rel_0_7/core/ schema.html # sqlalchemy.schema.MetaData.reflect) primero – van

+0

¡Guau, gracias por tu ayuda! Solo una pregunta más, si no te importa. Ahora, para obtener la instancia de la tabla, puedo hacer 'meta.tables ['tasks']', pero eso significa que debo recordar el nombre de la clase ('Tasks') y el nombre de la tabla 'tasks'. ¿Hay alguna manera de evitar eso? –

7

por ponerme tbl.drop(engine) trabajado, pero no existe engine.execute(tbl.delete())

0.8.0b2 SQLAlchemy y Python 2.7.3

Cuestiones relacionadas