2010-06-01 15 views
17

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

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

Respuesta

20

Hay numerosas maneras de lograr esto, incluyendo un sencillo os.system() llamada a la utilidad sqlite3 Si usted tiene que instalar, pero aquí es más o menos lo que haría de Python: Respuesta

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

Modificación de Peter Hansen aquí un poco, para usar SQLAlchemy lugar de acceso db prima

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

Sólo una pequeño rema rk: 'outcsv.writerows (records)' dará como resultado un 'Error: sequence expected' – miku

+1

También puede obtener todas las columnas a la vez usando el' __mapper__' [atributo] (http://www.sqlalchemy.org/docs /orm/extensions/declarative.html#synopsis), así: '[outcsv.writerow ([getattr (curr, column.name) para la columna en MyModel .__ mapper__.columnas]) para curr en registros] ' – miku

+0

Para agregar una fila de encabezado inicial para describir las columnas, use: ' outcsv.writerow ([column.name para la columna en MyModel .__ mapper __. columns]) ' – bschwagg

13

adapté los ejemplos anteriores a mi código basado 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 funciona para mí con sqlalchemy 0.7.9. Supongo que esto funcionaría con todos los objetos de tablas y resultados de sqlalchemy.

3
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]) 

Me pareció útil si no te importa la elaboración manual de las etiquetas de tus columnas.

+1

Esto es mucho más limpio que las respuestas de arriba. ¡Gracias! – Brodan

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

De forma modular: un ejemplo que utiliza 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:[email protected]: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, is_state, 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, 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,113634.57 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., y, y, connecticut, 41.597782, - 72.755371,3574097,4844.8 District of Columbia, DC, EE. UU., N, n, district-of-columbia, 38.897438, -77.026817,601723,68.34 Delaware, DE, US, y, y, delaware, 39.318523, -75.507141, 897934,1953.56 Florida, FL, Estados Unidos, y, y, la florida, 27.766279, -81.686783,18801310,53926.82 Georgia, GA, Estados Unidos, y, y, Georgia, 33.040619, -83.643074,9687653,57906.14