Как изменить курсор на следующую строку с помощью pyodbc в Python

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

Чтобы объяснить больше, в моей таблице 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()

person H.Burns    schedule 27.05.2016    source источник
comment
AFAIK, вам нужно будет повторно выполнить запрос (вы можете использовать тот же курсор) после каждого интервала. Есть ли у вас автоматически увеличивающееся поле идентификации как часть my_database_table? Если это так, вы можете установить переменную Python для отслеживания последнего идентификатора, а затем выбирать любые строки больше после каждого интервала.   -  person FlipperPA    schedule 27.05.2016
comment
@FlipperPA - согласен. Я подтвердил, что pyodbc не увидит новые строки в существующем курсоре без повторного выполнения запроса. Я также попробовал psyopg2 с курсором на стороне сервера и размером выборки 1 (строка) и получил тот же результат.   -  person Gord Thompson    schedule 27.05.2016
comment
Если вы хотите, чтобы @FlipperPA узнал о вашем комментарии, вам нужно использовать знак @, как это сделал я тогда.   -  person Gord Thompson    schedule 27.05.2016
comment
@FlipperPA, да, я повторно выполняю тот же запрос после каждого интервала, и у меня нет автоматически увеличивающегося поля в my_database_table. Есть ли способ удовлетворить мои требования?   -  person H.Burns    schedule 27.05.2016
comment
@ Горд Томпсон ... спасибо за советы.   -  person H.Burns    schedule 27.05.2016
comment
@ H.Burns Есть способы, но не такие элегантные и не на 100% надежные (например, если у вас есть две строки с одинаковыми точными данными в каждой). Можете ли вы изменить свой вопрос, включив в него поля таблицы и типы полей?   -  person FlipperPA    schedule 27.05.2016


Ответы (1)


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