сбросить CSV из sqlalchemy - PullRequest
       12

сбросить CSV из sqlalchemy

19 голосов
/ 01 июня 2010

По какой-то причине я хочу вывести таблицу из базы данных (sqlite3) в виде CSV-файла. Я использую скрипт Python с эликсиром (на основе sqlalchemy) для изменения базы данных. Мне было интересно, если есть какой-либо способ сбросить таблицу, которую я использую в CSV.

Я видел sqlalchemy сериализатор , но это не то, что я хочу. Я делаю это неправильно? Должен ли я вызывать модуль Python sqlite3 после закрытия сеанса sqlalchemy, чтобы вместо этого создать дамп в файл? Или я должен использовать что-то домашнее?

Ответы [ 6 ]

30 голосов
/ 02 июня 2010

Немного изменив ответ Питера Хансена, чтобы использовать SQLAlchemy вместо доступа к сырой базе данных

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()
22 голосов
/ 01 июня 2010

Существует множество способов добиться этого, включая простой os.system() вызов утилиты sqlite3, если она установлена, но вот примерно то, что я бы сделал из 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()
17 голосов
/ 07 ноября 2012

Я адаптировал приведенные выше примеры для моего кода на основе sqlalchemy:

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

Это работает для меня с sqlalchemy 0.7.9. Я полагаю, что это будет работать со всеми таблицами sqlalchemy и объектами результата.

3 голосов
/ 18 мая 2016
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])

Мне показалось, что это полезно, если вы не против изготовить ярлыки для своих колонок вручную.

1 голос
/ 13 января 2018
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 голосов
/ 13 января 2018

Модульным способом: пример использования slqalchemy с automap и 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()

Результаты:

имя, abv, страна, is_state, is_lower48, слизень, широта, долгота, население, область Аляска, AK, США, y, n, Аляска, 61.370716, -152.404419,710231,571951.25 Алабама, AL,США, y, y, Алабама, 32.806671, -86.79113,4779736,50744.0 Арканзас, AR, США, y, y, Арканзас, 34.969704, -92.373123,2915918,52068.17 Аризона, Аризона, США, y, y, Аризона, 33.729759,-111.431221,6392017,113634.57 Калифорния, Калифорния, США, y, y, Калифорния, 36.116203, -119.681564,37253956,155939.52 Колорадо, CO, US, y, y, Колорадо, 39.059811, -105.311104, 5029196, 1037295, КоннектикутСША, у, у, Коннектикут, 41,597782, -72,755371,3574097,4844,8 Округ Колумбия, округ Колумбия, США, н, п, округ Колумбия, 38,897438, -77,0217,601723,68,34 Делавэр, DE, США, у,y, Делавэр, 39.318523, -75.507141,897934,1953.56 Флорида, Флорида, США, y, y, Флорида, 27.766279, -81.686783,18801310,53926.82 Грузия, Джорджия, США, y, y, Грузия, 33.040619, -83.643074,9687653, 57906,14

...