从sqlalchemy导出csv

28 投票
9 回答
46650 浏览
提问于 2025-04-15 23:25

出于某种原因,我想把数据库(sqlite3)中的一个表导出成csv文件。我正在用一个Python脚本和elixir(基于sqlalchemy)来修改数据库。我想知道有没有办法把我用的表导出成csv。

我看到过sqlalchemy的序列化工具,但好像不是我想要的。难道我做错了什么?我是不是应该在关闭sqlalchemy会话后,调用sqlite3的Python模块来导出到文件?还是说我应该自己写点东西来实现?

9 个回答

19

我把上面的例子改成了适合我用的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表和结果对象。

42

稍微修改一下Peter Hansen在这里的回答,使用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()
30

有很多方法可以做到这一点,比如如果你安装了 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()

撰写回答