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 回目で 1 ~ 1000 行を正しく返しますが、2 回目のループでは、1001 ~ 2001 行ではなく、1 ~ 2001 行、1 ~ 3001 行などを返します。 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 に答える