volcar csv desde sqlalchemy

Por alguna razón, quiero volcar una tabla desde una base de datos (sqlite3) en forma de un archivo csv. Estoy usando un script de python con elixir (basado en sqlalchemy) para modificar la base de datos. Me preguntaba si hay alguna forma de volcar la tabla que uso para csv.

He visto el serializador sqlalchemy pero no parece ser lo que quiero. ¿Lo estoy haciendo mal? ¿Debo llamar al módulo pylon sqlite3 después de cerrar mi sesión de sqlalchemy para volcar en un archivo? ¿O debería usar algo casero?

Related of "volcar csv desde sqlalchemy"

Hay muchas formas de lograr esto, incluyendo una simple llamada os.system() a la utilidad sqlite3 si tiene eso instalado, pero esto es más o menos lo que haría desde Python:

 import sqlite3 import csv con = sqlite3.connect('mydatabase.db') outfile = open('mydump.csv', 'wb') outcsv = csv.writer(outfile) cursor = con.execute('select * from mytable') # dump column titles (optional) outcsv.writerow(x[0] for x in cursor.description) # dump rows outcsv.writerows(cursor.fetchall()) outfile.close() 

Modificando un poco la respuesta de Peter Hansen, para usar SQLAlchemy en lugar del acceso directo a la base de datos.

 import csv outfile = open('mydump.csv', 'wb') outcsv = csv.writer(outfile) records = session.query(MyModel).all() [outcsv.writerow([getattr(curr, column.name) for column in MyTable.__mapper__.columns]) for curr in records] # or maybe use outcsv.writerows(records) outfile.close() 

Adapté los ejemplos anteriores a mi código basado en sqlalchemy como este:

 import csv import sqlalchemy as sqAl metadata = sqAl.MetaData() engine = sqAl.create_engine('sqlite:///%s' % 'data.db') metadata.bind = engine mytable = sqAl.Table('sometable', metadata, autoload=True) db_connection = engine.connect() select = sqAl.sql.select([mytable]) result = db_connection.execute(select) fh = open('data.csv', 'wb') outcsv = csv.writer(fh) outcsv.writerow(result.keys()) outcsv.writerows(result) fh.close 

Esto me funciona con sqlalchemy 0.7.9. Supongo que esto funcionaría con todos los objetos de tabla y resultados de sqlalchemy.

 with open('dump.csv', 'wb') as f: out = csv.writer(f) out.writerow(['id', 'description']) for item in session.query(Queue).all(): out.writerow([item.id, item.description]) 

Descubrí que esto es útil si no te importa elaborar manualmente las tags de tus columnas.

 import csv f = open('ratings.csv', 'w') out = csv.writer(f) out.writerow(['id', 'user_id', 'movie_id', 'rating']) for item in db.query.all(): out.writerow([item.username, item.username, item.movie_name, item.rating]) f.close() 

De forma modular: un ejemplo utilizando slqalchemy con automap y mysql.

database.py:

 from sqlalchemy.ext.automap import automap_base from sqlalchemy.orm import Session from sqlalchemy import create_engine Base = automap_base() engine = create_engine('mysql://user:pass@localhost:3306/database_name', echo=True) Base.prepare(engine, reflect=True) # Map the tables State = Base.classes.states session = Session(engine, autoflush=False) 

export_to_csv.py:

 from databases import * import csv def export(): q = session.query(State) file = './data/states.csv' with open(file, 'w') as csvfile: outcsv = csv.writer(csvfile, delimiter=',',quotechar='"', quoting = csv.QUOTE_MINIMAL) header = State.__table__.columns.keys() outcsv.writerow(header) for record in q.all(): outcsv.writerow([getattr(record, c) for c in header ]) if __name__ == "__main__": export() 

Resultados:

nombre, abv, country, is_state, is_lower48, slug, latitud, longitud, población, área Alaska, AK, EE. UU., y, n, alaska, 61.370716, -152.404419,710231,571951.25 Alabama, AL, EE. UU., y, alabama , 32.806671, -86.79113,4779736,50744.0 Arkansas, AR, EE. UU., Y, y, arkansas, 34.969704, -92.373123,2915918,52068.17 Arizona, AZ, EE. UU., Y, y, arizona, 33.729759, -111.431221,6392017,1136. , CA, EE. UU., Y, y, california, 36.116203, -119.681564,37253956,155939.52 Colorado, CO, EE. UU., Y, y, colorado, 39.059811, -105.311104,5029196, 103717.53 Connecticut, CT, EE. UU., EE. UU. , 41.597782, -72.755371,3574097,4844.8 Distrito de Columbia, DC, EE. UU., N, n, distrito de Columbia, 38.897438, -77.026817,601723,68.34 Delaware, DE, EE. UU., EE. UU., Y, y, delaware, 39.318523, – 75.507141,897934,1953.56 Florida, FL, US, y, y, florida, 27.766279, -81.686783,18801310,53926.82 Georgia, GA, US, y, y, georgia, 33.040619, -83.643074,9687653657906.14