web-dev-qa-db-ja.com

sqlalchemyからcsvをダンプします

どういうわけか、データベース(sqlite3)からcsvファイルの形式でテーブルをダンプしたいと思います。 pythonスクリプトとelixir(sqlalchemyに基づく)を使用してデータベースを変更しています。使用しているテーブルをcsvにダンプする方法があるかどうか疑問に思いました。

Sqlalchemy serializer を見たことがありますが、私が望んでいるものではないようです。私はそれを間違っていますか? sqlalchemyセッションを閉じた後に sqlite3 python module を呼び出して、代わりにファイルにダンプする必要がありますか?それとも自家製のものを使用する必要がありますか?

21
tmoisan

これを実現する方法はたくさんあります。たとえば、_sqlite3_ユーティリティをインストールしている場合はos.system()を呼び出すだけですが、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()
_
23
Peter Hansen

ここでPeterHansenの回答を少し変更して、生のデータベースアクセスの代わりに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()
31
RyanWilcox

上記の例を、次のような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

これはsqlalchemy0.7.9で機能します。これはすべてのsqlalchemyテーブルと結果オブジェクトで機能すると思います。

18
TNT
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
michael g

私はこれが古いことを知っています、しかし私はちょうどこの問題を抱えていました、そしてこれは私がそれを解決した方法です

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=";")
1
Manu
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()
1
SalvorHardin

モジュール方式:automapとmysqlでslqalchemyを使用した例。

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

結果:

name、abv、country、is_state、is_lower48、slug、latitude、longitude、population、area Alaska、AK、US、y、n、alaska、61.370716、-152.404419,710231,571951.25 Alabama、AL、US、y、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.57カリフォルニア、CA、US、y、y、california、36.116203、-119.681564,37253956,155939.52 Colorado、CO、US、y、y、colorado、39.059811、-105.311104,5029196,103717.53 Connecticut、CT、US、y、y、connecticut 、41.597782、-72.755371,3574097,4844.8コロンビア特別区、DC、US、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、US、y、y、florida、27.766279、-81.686783,18801310,53926.82 Georgia、GA、US、y、y、georgia、33.040619、-83.643074,9687653,57906.14

0
Andre Araujo