2017-10-12 147 views
0

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

下面的代码工作:

进口ODO

进口熊猫作为PD

数据= ODO('的MySQL + pymysql://用户名:{0} @本地/ DBNAME :: { 1''。format('password','table_name'),pd.DataFrame)

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

回答

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) 

REF PG https://media.readthedocs.org/pdf/odo/latest/odo.pdf REF How to execute raw SQL in SQLAlchemy-flask app

REF cursor.fetchall() vs list(cursor) in Python

最后的30

,以提高执行速度,可以考虑附加的熊猫数据帧对于每个结果在结果中。

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?

+0

谢谢,但使用大熊猫读取数据库中的数据相比,ODO是缓慢的。有什么办法可以将一个SQL字符串传递给ODO方法吗? – user2714753

+0

ODO方法不会像文档指出的那样进行查询。为了利用(源,目标)结构,您需要按照我编辑的答案中所述传递字典。 – brddawg