Select 第 n 行到第 n 行,而 table 仍然有未选择 python 和 pyodbc 的值

Select nth to nth row while table still have values unselected with python and pyodbc

我有一个包含 10,000 行的 table,我想 select 前 1000 行,然后再次 select,这次是下一组行,即 1001 -2001.

我使用 BETWEEN 子句是为了 select 值的范围。我也可以增加值。这是我的代码:

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,我会将这些行发送到另一个数据库,我想加快这个过程。选择全部并将其发送到队列 returns 出错。

代码的输出是它在第一次 returns 1-1000 行时正确,但是在第二次循环中,它 returns 1-2001 行而不是 1001-2001 行, 1-3001 等等。它总是从 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 的临时 table,并且可能对您的情况有所帮助,因为您的进程看起来会使用相同的数据库连接完成所有工作:

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()