2016-04-26 9 views
0

データベースにアップロードしたいタプルのリストがあります。私はこれをという1つのクエリで行いたいので、各タプルを解析しながら接続を開く必要はありません。Python経由でPostgresにタプルリストをインポートする

私のタプルリストの例は次のとおりです(このリストはかなり長くなります): tuple_list = [(u'17 '、u'1'、u'2 '、u'2')、(u私は、このtuple_listをとり、リストを使って 'Predictions'という名前のテーブルを作成する1つのクエリをpostgresに書きたいと思います。 dbへの1回の呼び出しで。

単一の呼び出しは次のようになります。

insert into 'Predictions' (userid, fixture_no, home_score, away_score) values (17, 1, 2, 2) 

私は、XMLファイルに私のタプルを変換するに見えたが、タプルのリストを使用してちょうどPostgresの中でこれを行うのは良い方法があるのか​​疑問に思っていますか?

ない場合、私はこのようなルックスを作るために管理しているXMLファイル...

<root> 
    <User_Id/> 
    <Fix_No/> 
    <Home_Score/> 
    <Away_Score/> 
    <User_Id>17</User_Id> 
    <Fix_No>1</Fix_No> 
    <Home_Score>2</Home_Score> 
    <Away_Score>2</Away_Score> 
    <User_Id>17</User_Id> 
    <Fix_No>2</Fix_No> 
    <Home_Score>1</Home_Score> 
    <Away_Score>4</Away_Score> 
</root> 

私の主な目的は、その意志数多くの呼び出しを行うのではなく、1回のショットでデータベースにすべての私の予測を送信することです私のWebアプリケーションをより遅く動かす。

意見やアドバイスは素晴らしいと思います!

答えて

1

postgresql documentationの例の部分で説明した複数行のVALUES構文を使用できます。ここではあなたの質問からtuple_listからinsert文を作成するPythonを抜きました。

tuple_list = [(u'17',u'1', u'2', u'2'), (u'17',u'2', u'1', u'4')] 
a = ["("+", ".join(a)+")" for a in tuple_list] 
sql = "insert into 'Predictions' (userid, fixture_no, home_score, away_score) VALUES %s" % (",".join(a)) 
print(sql) 

# Insert into database (code from memory) 
args_str = ','.join(cursor.mogrify("%s", (x,)) for x in tuple_list) 
cursor.execute("INSERT INTO 'Predictions' (userid, fixture_no, home_score, away_score) VALUES "+args_str) 

出力:

insert into 'Predictions' (userid, fixture_no, home_score, away_score) VALUES (17, 1, 2, 2),(17, 2, 1, 4) 
+0

コメントは非常に有用であるように、私はpostgresのに新たなんです。タプルのリストには5タプル、さらには50タプルがあるので、どのタプルに合うクエリを書くことができますか? – LemusThelroy

+0

これは素晴らしい答えです。ありがとうございました。このクエリがPythonコード内にある場合、SQLインジェクションから安全だと思いますか? tuple_listはWebアプリケーションからのユーザー入力に由来します。 – LemusThelroy

+0

@LemusThelroy挿入されたすべてのデータが適切にエスケープされていることを確認する必要があります。ストアドプロシージャを作成することをお勧めします。この例は保存しません! – salomonderossi

関連する問題