从sqlalchemy转储csv

tmo*_*san 21 python csv sqlalchemy python-elixir

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

我见过sqlalchemy 序列化器,但它似乎不是我想要的.我做错了吗?我应该在关闭sqlalchemy会话后调用sqlite3 python模块转储到文件吗?或者我应该使用自制的东西?

Rya*_*cox 31

稍后修改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()
Run Code Online (Sandbox Code Playgroud)

  • 同样,您也可以使用__mapper__ [属性](http://www.sqlalchemy.org/docs/orm/extensions/declarative.html#synopsis)一次获得所有列,如下所示:`[outcsv.writerow( [用于记录中的curr的MyModel .__ mapper __。columns中的列的getattr(curr,column.name)) (2认同)
  • 要添加初始标题行来描述列,请使用:`outcsv.writerow([MyModel .__ mapper __。columns中的列的名称。 (2认同)
  • 请注意,对于 python3,文件写入应以文本模式完成,而不是二进制: outfile = open('mydump.csv', 'w') (2认同)

Pet*_*sen 23

有很多方法可以实现这一点,包括如果你已经安装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()
Run Code Online (Sandbox Code Playgroud)

  • 这将是使用上下文管理器的完美示例。 (2认同)

TNT*_*TNT 17

我将上面的例子改编成我的基于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
Run Code Online (Sandbox Code Playgroud)

sqlalchemy 0.7.9对我有用.我想这适用于所有sqlalchemy表和结果对象.


小智 8

我知道这已经很旧了,但我刚刚遇到了这个问题,这就是我解决它的方法

import pandas as pd
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=";")
Run Code Online (Sandbox Code Playgroud)


mic*_*l g 6

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])
Run Code Online (Sandbox Code Playgroud)

如果您不介意手工制作列标签,我发现这很有用。