Dump csv из sqlalchemy
По какой-то причине я хочу сбросить таблицу из базы данных (sqlite3) в виде файла csv. Я использую python script с elixir (на основе sqlalchemy) для изменения базы данных. Мне было интересно, есть ли способ сбросить таблицу, которую я использую для csv.
Я видел sqlalchemy serializer, но, похоже, это не то, что я хочу. Я делаю это неправильно? Должен ли я вызвать модуль python sqlite3 после закрытия моего сеанса sqlalchemy вместо дампа в файл? Или я должен использовать что-то самодельное?
Ответы
Ответ 1
Существует множество способов достижения этого, включая простой вызов 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()
Ответ 2
Модифицируя Peter Hansen, ответьте здесь немного, чтобы использовать SQLAlchemy вместо raw db access
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()
Ответ 3
Я применил приведенные выше примеры к моему основанию на основе 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 и объектами результатов.
Ответ 4
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])
Я нашел, что это полезно, если вы не возражаете против создания ваших ярлыков столбцов.
Ответ 5
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()
Ответ 6
Модульным способом: пример использования 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:[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()
Результаты:
имя, ABV, страна, is_state, is_lower48, слизняк, широта, долгота, население, площадь
Аляска, AK, США, у, п, Alaska, 61.370716, -152.404419,710231,571951.25
Alabama, AL, США, у, у, Алабама, 32.806671, -86.79113,4779736,50744.0
Арканзас, AR, США, у, у, Арканзас, 34.969704, -92.373123,2915918,52068.17
Arizona, AZ, США, у, у, аризоны, 33.729759, -111.431221,6392017,113634.57
California, CA, США, у, у, калифорния, 36.116203, -119.681564,37253956,155939.52
Колорадо, CO, США, у, у, колорадо, 39.059811, -105.311104,5029196,103717.53
Коннектикут, штат Коннектикут, США, у, у, коннектикут, 41.597782, -72.755371,3574097,4844.8
Округ Колумбия, округ Колумбия, США, n, n, округ Колумбия, 38.897438, -77.026817,601723,68.34
Делавэр, DE, США, у, у, Делавер, 39.318523, -75.507141,897934,1953.56
Флорида, Флорида, США, у, у, Флорида, 27.766279, -81.686783,18801310,53926.82
Грузия, GA, США, у, у, грузия, 33.040619, -83.643074,9687653,57906.14
Ответ 7
Я знаю, что это старый, но у меня была эта проблема, и вот как я ее решил
from sqlalchemy import create_engine
basedir = os.path.abspath(os.path.dirname(__file__))
sql_engine = create_engine(os.path.join('sqlite:///' + os.path.join(basedir, 'single_file_app.db')), echo=False)
results = pd.read_sql_query('select * from users',sql_engine)
results.to_csv(os.path.join(basedir, 'mydump2.csv'),index=False,sep=";")