2016-07-23 40 views
2

有沒有辦法執行一個SQL查詢,加入一個類似dict的結構,而不是在數據庫中,而是在查詢中提供的MySQL表?加入Python字典與MySQL表

特別是,我經常需要後處理數據,我從數據庫中提取相應的匯率。匯率並不存儲在數據庫中,而是隨時檢索並暫時存儲在Python字典中。

所以,我有一個字典:exchange_rates = {'EUR':1.10,'GBP':1.31,...}。

讓我們假設一些查詢返回類似於:id,amount,currency_code。

是否可以將字典添加到查詢中,以便我可以返回:id,amount,currency_code,usd_amount?這將消除在Python中後處理的需要。

回答

1

該解決方案不使用「連接」,但通過case語句將Python中的數據合併到SQL中。你可以用python生成你想要的sql(作爲一個字符串),在一個巨大的case語句中包含這些值。

你沒有提供任何細節,也沒有說哪個版本的Python,所以很難提供有用的代碼。但是,這對Python 2.7,假設你有一些Python連接到MySQL數據庫:

exchange_rates = {'EUR': 1.10, 'GBP': 1.31, ...} 

# create a long set of case conditions as a string 
er_case_statement = "\n".join("mytable.currency = \"{0}\" then {1}".format(k,v) for (k,v) in exchange_rates.iteritems()) 

# build the sql with these case statements 
sql = """select <some stuff>, 
    case {0} 
    end as exchange_rate, 
    other columns 
    from tables etc 
    where etc 
""".format(er_case_statement) 

然後發送此SQL到MySQL

我不喜歡這樣的解決方案;你最終會得到一個非常大的SQL語句,它可以達到最大值(What is maximum query size for mysql?)。

另一個想法是在mysql中使用臨時表。再次假設你正在連接到Python中的數據庫,使用python創建一個創建臨時表並插入匯率的sql,然後將其發送到MySQL,然後構建一個將數據連接到該臨時表的查詢。

最後你說你不想在python中後處理,但你有一個字典從某處我不知道你使用的是哪個環境但是如果你可以從網上獲得這些匯率, CURL,那麼你可以使用shell將這些值插入MySQL臨時表中,然後加入。

對不起,這是一般性的,而不是具體的,但問題可以使用更多的特異性。希望它能幫助別人給出更有針對性的答案。

+0

謝謝,這非常有幫助。 – chrisvdb