2016-07-23 1 views
2

MySQLテーブルを、データベースにはなくクエリで提供されているdict-like構造体と結合するSQLクエリを実行する方法はありますか?Python dictとMySQLテーブルの結合

特に、私は定期的にデータベースから抽出したデータを、それぞれの為替レートで後処理する必要があります。為替レートはデータベースには格納されませんが、その場で検索され、Pythonの辞書に一時的に格納されます。

私はdict:exchange_rates = {'EUR':1.10、 'GBP':1.31、...}を持っています。

たとえば、id、amount、currency_codeなどのクエリを返すクエリがあるとします。

dictをクエリに追加して、返すことができますか?id、amount、currency_code、usd_amount?これにより、Pythonで後処理する必要がなくなります。

答えて

1

このソリューションは 'join'を使用しませんが、Pythonのデータをcase文を介してSQLに結合します。あなたは、巨大なcase文でこれらの値を含むPythonで(文字列として)必要なsqlを生成することができます。

あなたは詳細を教えておらず、どのバージョンのPythonを使っているのかわからないので、役に立つコードを提供するのは難しいです。しかし、これは、Python 2.7で動作し、あなたがPythonでMySQLのDBへのいくつかの接続を持っている前提としています。そして、

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) 

MySQLの

にこのSQLを送って、私はこのソリューションを好きではありません。最大限に達することができる非常に大きなSQL文で終わります(What is maximum query size for mysql?)。

別のアイデアは、mysqlで一時テーブルを使用することです。 PythonでPythonでdbに接続していると仮定すると、一時テーブルを作成し、為替レートを挿入してMySQLに送信し、その一時テーブルにデータを結合するクエリを作成するsqlを作成します。

最後に、あなたはPythonで後処理したくないと言っていますが、あなたはどこの環境かを知っていないのですが、これらの交換レートをウェブから得ることができればCURLを使用すると、シェルを使用してこれらの値をMySQLの一時テーブルに挿入してそこに参加することもできます。

申し訳ありませんが、これは一般的で具体的ではありませんが、問題はより具体性があります。他の人がよりターゲットを絞った答えを出すのを助けることを願っています

+0

ありがとう、とても助かりました。 – chrisvdb