Выберите строки с 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()