将数据从sqlalchemy移动到pandas DataFrame

Dav*_*ins 3 python session sqlalchemy pandas

我正在尝试在pandas DataFrame中加载SQLAlchemy.

当我做:

df = pd.DataFrame(LPRRank.query.all())
Run Code Online (Sandbox Code Playgroud)

我明白了

>>> df
0        <M. Misty || 1 || 18>
1        <P. Patch || 2 || 18>
...
...
Run Code Online (Sandbox Code Playgroud)

但是,我想要的是数据库中的每一列都是数据帧中的一列:

0        M. Misty  1  18
1        P. Patch  2  18
...
...
Run Code Online (Sandbox Code Playgroud)

当我尝试:

dff = pd.read_sql_query(LPRRank.query.all(), db.session())
Run Code Online (Sandbox Code Playgroud)

我收到属性错误:

AttributeError: 'SignallingSession' object has no attribute 'cursor'
Run Code Online (Sandbox Code Playgroud)

dff = pd.read_sql_query(LPRRank.query.all(), db.session)
Run Code Online (Sandbox Code Playgroud)

也会出错:

AttributeError: 'scoped_session' object has no attribute 'cursor'
Run Code Online (Sandbox Code Playgroud)

我用来生成对象列表的是:

app = Flask(__name__)
db = SQLAlchemy(app)

class LPRRank(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    candid = db.Column(db.String(40), index=True, unique=False)
    rank = db.Column(db.Integer, index=True, unique=False) 
    user_id = db.Column(db.Integer, db.ForeignKey('lprvote.id'))

    def __repr__(self):
        return '<{} || {} || {}>'.format(self.candid,
                                                 self.rank, self.user_id) 
Run Code Online (Sandbox Code Playgroud)

这个问题: 如何将SQL查询结果转换为PANDAS数据结构? 没有错误,但将每一行作为一个对象,这不是我想要的.我可以访问返回对象中的各个列,但似乎有更好的方法来执行它.

pandas.pydata.org上的文档很棒,如果您已经了解了正在发生的事情并且只需要查看语法.2016年4月20日的文档(1319页pdf)标识了pandas连接,在p.872上仍然是实验性的.

现在,SQLALCHEMY/PANDAS - 作为Pandas to_sql的CLOB的SQLAlchemy读取列是关于指定SQL类型的.我的SQLAlchemy是默认的.

并且,sqlalchemy pandas to_sql OperationalError,使用SQLAlchemy,to_sqlSQLAlchemy/pandas to_sql为SQLServer 写入MySQL数据库- 主数据库中的CREATE TABLE是关于写入SQL数据库,这会产生操作错误,数据库错误,以及一个'创建表'错误,这两个都不是我的问题.

这个,来自jsonb的SQLAlchemy Pandas read_sql想要一个jsonb属性到列:不是我的杯子茶.

以前的问题SQLAlchemy ORM转换为pandas DataFrame解决了我的问题但解决方案:使用query.session.bind不是我的解决方案.我正在使用db.session.add()和db.session.commit()打开/关闭会话,但是当我db.session.bind按照第二个答案中的指定使用时,我得到一个属性错误:

AttributeError: 'list' object has no attribute '_execute_on_connection'
Run Code Online (Sandbox Code Playgroud)

Par*_*ait 11

只需__init__在模型中添加一个方法,然后在构建数据框之前调用Class对象.具体来说,下面创建一个可迭代的元组绑定到列中pandas.DataFrame().

class LPRRank(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    candid = db.Column(db.String(40), index=True, unique=False)
    rank = db.Column(db.Integer, index=True, unique=False) 
    user_id = db.Column(db.Integer, db.ForeignKey('lprvote.id'))

    def __init__(self, candid=None, rank=None, user_id=None):
        self.data = (candid, rank, user_id)

    def __repr__(self):
        return (self.candid, self.rank, self.user_id) 

data = db.session.query(LPRRank).all()
df = pd.DataFrame([(d.candid, d.rank, d.user_id) for d in data], 
                  columns=['candid', 'rank', 'user_id'])
Run Code Online (Sandbox Code Playgroud)

或者,使用基于您定义的Model类LPRRank的SQLAlchemy ORM 来运行read_sql:

df = pd.read_sql(sql = db.session.query(LPRRank)\
                         .with_entities(LPRRank.candid,
                                        LPRRank.rank,
                                        LPRRank.user_id).statement, 
                 con = db.session.bind)
Run Code Online (Sandbox Code Playgroud)