Выберите строки с n по n, в то время как в таблице все еще есть значения, невыбранные с помощью python и pyodbc

У меня есть таблица с 10000 строк, и я хочу выбрать первые 1000 строк, а затем снова выбрать и на этот раз следующий набор строк, который составляет 1001-2001.

Я использую BETWEEN предложение для выбора диапазона значений. Я также могу увеличивать значения. Вот мой код:

count = cursor.execute("select count(*) from casa4").fetchone()[0]    
ctr = 1
ctr1 = 1000
str1 = ''
while ctr1 <= count:
    sql = "SELECT AccountNo FROM ( \
        SELECT AccountNo, ROW_NUMBER() OVER (ORDER BY Accountno) rownum \
        FROM  casa4 ) seq \
        WHERE seq.rownum BETWEEN " + str(ctr) + " AND " + str(ctr1) + ""
    ctr = ctr1 + 1
    ctr1 = ctr1 + 1000
    cursor.execute(sql)
    sleep(2) #interval in printing of the rows.

for row in cursor:
    str1 = str1 + '|'.join(map(str,row)) + '\n'
print "Records:" + str1 #var in storing the fetched rows from database.
print sql #prints the sql statement(str) and I can see that the var, ctr and ctr1 have incremented correctly. The way I want it.

Чего я хочу добиться - это использовать очередь сообщений RabbitMQ, я отправлю эти строки в другую базу данных и хочу ускорить процесс. Выбор всего и отправка его в очередь возвращает ошибку.

Вывод кода состоит в том, что он возвращает 1-1000 строк правильно на 1-м, но во 2-м цикле вместо 1001-2001 строк возвращает 1-2001 строк, 1-3001 и т. Д. Он всегда начинается с 1.

1 ответ

Решение

Я смог воссоздать вашу проблему с pyodbc и pypyodbc. Я также пытался использовать

WITH seq (AccountNo, rownum) AS
(
    SELECT AccountNo, ROW_NUMBER() OVER (ORDER BY Accountno) rownum
    FROM casa4
)
SELECT AccountNo FROM seq
WHERE rownum BETWEEN 11 AND 20

Когда я запускаю это в SSMS, я просто получаю строки с 11 по 20, но когда я запускаю его из Python, я получаю все строки (начиная с 1).

Следующий код работает с использованием pyodbc. Он использует временную таблицу с именем #numberedи может быть полезным в вашей ситуации, поскольку ваш процесс выглядит так, как будто он будет выполнять всю свою работу, используя одно и то же соединение с базой данных:

import pyodbc
cnxn = pyodbc.connect("DSN=myDb_SQLEXPRESS")
crsr = cnxn.cursor()
sql = """\
CREATE TABLE #numbered (rownum INT PRIMARY KEY, AccountNo VARCHAR(10))
"""
crsr.execute(sql)
cnxn.commit()
sql = """\
INSERT INTO #numbered (rownum, AccountNo)
SELECT
    ROW_NUMBER() OVER (ORDER BY Accountno) AS rownum,
    AccountNo
FROM casa4
"""
crsr.execute(sql)
cnxn.commit()
sql = "SELECT AccountNo FROM #numbered WHERE rownum BETWEEN ? AND ? ORDER BY rownum"
batchsize = 1000
ctr = 1
while True:
    crsr.execute(sql, [ctr, ctr + batchsize - 1])
    rows = crsr.fetchall()
    if len(rows) == 0:
        break
    print("-----")
    for row in rows:
        print(row)
    ctr += batchsize
cnxn.close()
Другие вопросы по тегам