从sqlalchemy导出csv
出于某种原因,我想把数据库(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()