2016-05-02 8 views
1

pyodbc executemany関数を使用しようとすると問題が発生します。 私はOracleデータベースを持っており、複数の日のデータを抽出したいと考えています。pyodbcのExecutemanyは最後のパラメータの結果を返します

私のリクエストでは、データベースが日付フィールドに索引付けされておらず、永遠に使用されているため、間には使用できません。 私は一日中手作業で質問し、回答を処理したいと思います。 この部分はスレッドできませんので、executemanyを使用してより迅速に行を取得したいと考えていました。

問題は私がexecutemanyを使用したときです。私は最後の引数の結果を得ました。行で

import pyodbc 

conn = pyodbc.connect('DRIVER={Oracle in instantclient_11_2};DBQ=dbname;UID=uid;PWD=pwd') 
cursor = conn.cursor() 
query = "SELECT date FROM table WHERE date = TO_DATE(?, 'DD/MM/YYYY')" 
query_args = (
       ('29/04/2016',), 
       ('28/04/2016',), 
) 
cursor.executemany(query, query_args) 
rows = cursor.fetchall() 

は、私だけ(datetime.datetime(2016, 4, 28, 0, 0),)で行を見つけることができます。

は、ここに私のコードです。 常に最後の引数です。

私は11.0.2のクライアントを持つOracleデータベースのWinPythonからPython 2.7.9を使用しています。 このクエリ以外のすべてのクエリは完全に正常です。私は、データベース側の操作を制限したい、とスクリプト側でのものの大半を行う

  • を(私が試したが、それはあまりにも長いです)

  • を:

    私は2つの理由のためにIN() synthaxを使用することはできません

  • リクエストに1000以上の異なる日付が表示されることがあります。

(今私は、IN()OR IN()ORからIN()を使用して...しかし、誰もが素晴らしいだろう、より良いものを見つけた場合だ!)

私が何か間違ったことをやっていますか?

ありがとうございます。

答えて

1

クエリは1つの引数で1回実行されます。複数の日付に対して実行する場合は "IN"節を使用します。これは、query_argsを少し変更する必要があります。

"SELECT date FROM table WHERE date in (TO_DATE(?, 'DD/MM/YYYY'), TO_DATE(?, 'DD/MM/YYYY'))" 

query_args = (
      ('29/04/2016','28/04/2016'), 
) 

または各日付引数を通じてカーソル:私は私が言ったように、私はそれが私のデータベースにあまりにも多くの時間を取っているため、データベース側での操作を制限したいことを行うことができますが、本当だ

while query_arg in query_args: 
    cursor.executemany(query, query_arg) 
    rows = cursor.fetchall() 
+0

、Iスクリプト側で処理したいので、executemanyを使いたいのです。あなたの要求に 'execute'を使うことができます。' executemany'は必要ありません。 – Anthony

関連する問題