【问题标题】:fetch data from mysql database using Python' odo library使用 Python 的 odo 库从 mysql 数据库中获取数据
【发布时间】:2018-03-24 21:24:42
【问题描述】:

我需要使用 Python 中的 odo 库将数据从 MySQL 数据库提取到 Pandas 数据框中。 Odo 的文档仅提供了有关传递表名以获取数据的信息,但是如何传递从数据库中获取所需数据的 SQL 查询字符串。

以下代码有效:

导入 odo

将熊猫导入为 pd

data = odo('mysql+pymysql://username:{0}@localhost/dbname::{1}'.format('password', 'table_name'), pd.DataFrame)

但是如何传递 SQL 字符串而不是表名。因为我需要连接多个其他表来提取所需的数据。

【问题讨论】:

    标签: python pandas sqlalchemy odo


    【解决方案1】:

    模块不支持将字符串直接传递给 odo。使用列出的工具可以通过三种方法移动数据。

    首先,创建一个 sql 查询作为字符串并使用:

    data = pandas.read_sql_query(sql, con, index_col=None,
                                 coerce_float=True, params=None,
                                 parse_dates=None, chunksize=None)[source]
    

    参考http://pandas.pydata.org/pandas-docs/version/0.20/generated/pandas.read_sql_query.html#pandas.read_sql_query

    其次,使用 odo 方法需要在字典中运行查询,然后在 odo(source, destination) 结构中使用字典。

    cursor.execute(sql)
    results = db.engine.execute(sql)
    
    data = odo(results, pd.DataFrame)
    

    参考https://media.readthedocs.org/pdf/odo/latest/odo.pdf的第30页

    参考How to execute raw SQL in SQLAlchemy-flask app

    参考cursor.fetchall() vs list(cursor) in Python

    最后,为了提高执行速度,请考虑在结果中为每个结果附加 pandas 数据框。

    result = db.engine.execute(sql).fetchone()
    
    data = pd.DataFrame(index=index, columns=list('AB'))
    data = df_.fillna(0) # with 0s rather than NaNs
    
    while result is not None:
        dataappend = pd.DataFrame(result, columns=list('AB'))
        data.append(dataappend)
        result = db.engine.execute(sql).fetchone()
    

    参考https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.append.html

    参考Creating an empty Pandas DataFrame, then filling it?

    【讨论】:

    • 谢谢,但是与 ODO 相比,使用 pandas 读取数据库数据的速度很慢。有什么方法可以将 SQL 字符串传递给 ODO 方法?
    • ODO 方法不会像文档指出的那样进行查询。为了利用(源,目标)结构,您需要按照我编辑的答案中所述传递字典。
    猜你喜欢
    • 2017-12-07
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    相关资源
    最近更新 更多