2016-05-27 18 views
1

レコードを増やすデータベーステーブルから一定間隔でレコードを取得しようとしています。私はPythonとpyodbcパッケージを使ってレコードの取り出しを行っています。フェッチ中に、どのようにして最後に読み込み/フェッチされた行の次の行にカーソルを向けることができるので、すべてのフェッチで新しいレコードセットが挿入されるだけです。Pythonでpyodbcを使用してカーソルを次の行に変更するには

詳細については、 私のテーブルは100レコードあり、それらはフェッチされます。 テーブルの後に200のレコードがあり、101から200までの行をフェッチしたいとします。

pyodbcカーソルがある方法はありますか? 他の提案は非常に役に立ちます。私はあなたが「新しい」行を検索するために、pyodbc、またはその他のODBCパッケージを使用することができるとは思わない

#!/usr/bin/python 
import pyodbc 
import csv 
import time 


conn_str = (
    "DRIVER={PostgreSQL Unicode};" 
    "DATABASE=postgres;" 
    "UID=userid;" 
    "PWD=database;" 
    "SERVER=localhost;" 
    "PORT=5432;" 
    ) 

conn = pyodbc.connect(conn_str) 
cursor = conn.cursor() 

def fetch_table(**kwargs): 
    qry = kwargs['qrystr'] 
    try: 
     #cursor = conn.cursor() 
     cursor.execute(qry) 
     all_rows = cursor.fetchall() 
     rowcnt = cursor.rowcount 
     rownum = cursor.description 
     #return (rowcnt, rownum) 
     return all_rows 
    except pyodbc.ProgrammingError as e: 
     print ("Exception occured as :", type(e) , e) 

def poll_db(): 

    for i in [1, 2]: 

     stmt = "select * from my_database_table" 
     rows = fetch_table(qrystr = stmt) 

     print("***** For i = " , i , "******") 
     for r in rows: 
      print("ROW-> ", r) 
     time.sleep(10) 


poll_db() 
conn.close() 
+1

私の知る限りでは、あなたは、各間隔の後に(あなたは同じカーソルを使用することができます)クエリを再実行する必要があるとしています。あなたは 'my_database_table'の一部として自動インクリメントIDフィールドを持っていますか?そうであれば、Python変数を設定して最後のIDを追跡し、各間隔の後に大きい行を選択することができます。 – FlipperPA

+1

@FlipperPA - 私は同意します。 pyodbcはクエリを再実行せずに既存のカーソルの新しい行を「参照」しないことを確認しました。私はまた、サーバー側のカーソルと1(行)のフェッチサイズでpsyopg2を試して、同じ結果を得ました。 –

+1

@FlipperPAにあなたのコメントが通知されるようにするには、私がそこに行ったように '@'記号を使用する必要があります。 –

答えて

1

:以下

は、私がしようとしているコードです。しかし、データベースに「タイムスタンプ」列がある場合、またはそのような列を追加できる場合(一部のデータベースでは、挿入時に自動的にデータが読み込まれるため、挿入クエリを変更する必要はありません)以前のタイムスタンプより長いタイムスタンプを持つ行のみを選択するようにクエリを変更できます。そして、各反復でprev_timestamp変数を変更し続けることができます。

def poll_db(): 

    prev_timestamp = "" 
    for i in [1, 2]: 
     if prev_timestamp == "": 
      stmt = "select * from my_database_table" 
     else: 
      # convert your timestamp str to match the database's format 
      stmt = "select * from my_database_table where timestamp > " + str(prev_timestamp) 

     rows = fetch_table(qrystr = stmt) 
     prev_timestamp = datetime.datetime.now() 
     print("***** For i = " , i , "******") 
     for r in rows: 
      print("ROW-> ", r) 
     time.sleep(10) 
関連する問題