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.