python csv sqlalchemy python-elixir

python - volcar csv desde sqlalchemy



python-elixir (6)

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.

Por alguna razón, quiero volcar una tabla de una base de datos (sqlite3) en la 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 serializer 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?


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, país, estado_estado, is_lower48, babosa, 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, US, y, y, arkansas, 34.969704, -92.373123,2915918,52068.17 Arizona, AZ, US, y, y, arizona, 33.729759, -111.431221,6392017,113634.7 California , 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., 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


Modificando un poco la respuesta de Peter Hansen aquí, 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()


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


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


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 etiquetas de tus columnas.