使用Python的odo库从mysql数据库中获取数据

时间:2017-10-12 20:12:13

标签: python pandas sqlalchemy odo

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

以下代码有效:

导入odo

将pandas导入为pd

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

cursor.execute(sql)
results = db.engine.execute(sql)

data = odo(results, pd.DataFrame)

参考https://media.readthedocs.org/pdf/odo/latest/odo.pdf

的第30页

ref How to execute raw SQL in SQLAlchemy-flask app

ref 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()

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

ref Creating an empty Pandas DataFrame, then filling it?