2

我有一个包含 10,000 行的表,我想选择前 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-2001 行、1-3001 等,而不是 1001-2001 行。它总是开始1.

4

1 回答 1

0

我能够用 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()
于 2015-05-08T13:55:34.030 回答