从sqlalchemy转储csv

2024-05-29 03:47:50 发布

您现在位置:Python中文网/ 问答频道 /正文

出于某种原因,我想以csv文件的形式从数据库(sqlite3)转储一个表。我正在使用一个python脚本和elixir(基于sqlalchemy)来修改数据库。我想知道是否有任何方法可以转储我用来csv的表。

我见过sqlalchemyserializer,但它似乎不是我想要的。我做错了吗?我应该在关闭sqlalchemy会话后调用sqlite3 python module来转储到文件吗?或者我应该用自制的东西?


Tags: 文件csv方法脚本数据库sqlalchemysqlite3形式
3条回答

实现这一点的方法有很多,其中包括一个简单的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()

在这里稍微修改一下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()

我将上述示例改编为基于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表和结果对象。

相关问题 更多 >

    热门问题