2017-10-12 219 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