2016-05-27 4 views
1

Я пытаюсь получить записи после регулярного интервала из таблицы базы данных, которая растет с помощью записей. Я использую Python и его пакет pyodbc для выполнения выборки записей. Во время выборки, как я могу навести курсор на следующую строку строки, которая была прочитана/взята последним, так что при каждой выборке я могу получить только новый набор вставленных записей.Как изменить курсор на следующую строку с помощью pyodbc в Python

Чтобы подробнее рассказать, мой стол имеет 100 записей, и они извлекаются. после интервала в таблице 200 записей, и я хочу получить строки от 101 до 200. И так далее.

Есть ли способ с курсором pyodbc? Или любое другое предложение было бы очень полезно.

Ниже приведен код, я пытаюсь:

#!/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

AFAIK, вам нужно будет повторно выполнить запрос (вы можете использовать тот же самый курсор) после каждого интервала. У вас есть auto-incrementing поле идентификации как часть 'my_database_table'? Если это так, вы можете установить переменную Python для отслеживания последнего идентификатора, а затем выбрать любые строки больше после каждого интервала. – FlipperPA

+1

@FlipperPA - Я согласен. Я подтвердил, что pyodbc не будет «видеть» новые строки в существующем курсоре без повторного выполнения запроса. Я также попробовал psyopg2 с помощью серверного курсора и размером выборки 1 (строка) и получил тот же результат. –

+1

Если вы хотите, чтобы @FlipperPA был уведомлен о вашем комментарии, вам нужно использовать знак '@', как я уже там. –

ответ

1

Я не думаю, что вы можете использовать pyodbc, или любой другой Odbc пакет, чтобы найти «новые» строки. Но если в вашей базе данных есть столбец «timestamp», или если вы можете добавить такой столбец (некоторые базы данных позволяют автоматически заполнять его как время вставки, поэтому вам не нужно менять запросы на вставку), тогда вы может изменить ваш запрос, чтобы выбрать только строки, временная метка которых больше, чем предыдущая временная метка. И вы можете продолжать изменять переменную 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)