dump csv from sqlalchemy

Posted on

Question :

dump csv from sqlalchemy

For some reason, I want to dump a table from a database (sqlite3) in the form of a csv file. I’m using a python script with elixir (based on sqlalchemy) to modify the database. I was wondering if there is any way to dump the table I use to csv.

I’ve seen sqlalchemy serializer but it doesn’t seem to be what I want. Am I doing it wrong? Should I call the sqlite3 python module after closing my sqlalchemy session to dump to a file instead? Or should I use something homemade?

Asked By: tmoisan


Answer #1:

There are numerous ways to achieve this, including a simple os.system() call to the sqlite3 utility if you have that installed, but here’s roughly what I’d do from 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

Answered By: Peter Hansen

Answer #2:

Modifying Peter Hansen’s answer here a bit, to use SQLAlchemy instead of 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)

Answered By: RyanWilcox

Answer #3:

I adapted the above examples to my sqlalchemy based code like this:

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)



This works for me with sqlalchemy 0.7.9. I suppose that this would work with all sqlalchemy table and result objects.

Answered By: TNT

Answer #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])

I found this to be useful if you don’t mind hand-crafting your column labels.

Answered By: michael g

Answer #5:

I know this is old, but i just had this problem and this is how i solved it

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=";")
Answered By: Manu

Answer #6:

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])
Answered By: SalvorHardin

Answer #7:

In a modular way: an example using slqalchemy with automap and mysql.


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)


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


        for record in q.all():
            outcsv.writerow([getattr(record, c) for c in header ])

if __name__ == "__main__":


District of Columbia,DC,US,n,n,district-of-columbia,38.897438,-77.026817,601723,68.34

Answered By: Andre Araujo

Answer #8:

I spent a lot of time searching for a solution to this problem and finally created something like this:

from sqlalchemy import inspect

with open(file_to_write, 'w') as file:
    out_csv = csv.writer(file, lineterminator='n')

    columns = [column.name for column in inspect(Movies).columns][1:]

    session_3 = session_maker()

    extract_query = [getattr(Movies, col) for col in columns]
    for mov in session_3.query(*extract_query):


It creates a CSV file with column names and a dump of the entire “movies” table without “id” primary column.

Answered By: Kamil G?owacki

Leave a Reply

Your email address will not be published. Required fields are marked *