Я не очень понимаю, чего вы хотите, поэтому я не могу помочь вам достичь этого. Надеюсь, я смогу помочь вам понять, почему ваш код делает то, что делает.
Я добавил несколько строк в ваш код и пометил их цифрами #n
, чтобы ссылаться на них в своих объяснениях. Вывод моего кода начинается со звездочки, так что вы можете различить его и не мешать вашему.
Cursor.execute () возвращает ссылку на тот же курсор.
Следовательно, senRow1
и senRow2
на самом деле - это один и тот же объект , что доказано #5
, где утверждается эта идентичность. И когда вы извлекаете первую строку senRow1
и первую строку senrow2
, вы на самом деле разбиваете две первые строки одного и того же курсора, называете его cur
, senRow1
или senRow2
, они все разные имена для одной и той же вещи.
На самом деле выполнение первого запроса бесполезно, потому что перед тем, как что-либо делать с ним, вы выполняете второй в том же курсоре, и результат первого теряется.
Изменение лимита изменяет количество строк, но не меняет первые строки.
Чтобы продемонстрировать это, я создаю два курсора в #1
и #2
, выполняю запросы в #3
и #4
и печатаю все строки в #6
и #7
. Как видите, количество возвращаемых строк зависит от лимита, но первые строки остаются неизменными независимо от лимита.
Обратите внимание, что я печатаю результат первого запроса для полной полноты, но, как объяснялось ранее, только второй запрос относится к вашему коду.
Таким образом, в каждой итерации цикла вы смотрите на первые две строки, возвращаемые вторым запросом. И эти две строки одинаковы в каждой итерации.
Модифицированный код:
countNumRows = cur.execute("SELECT count(*) FROM SEN_Table")
countNumFetch = countNumRows.fetchone()
countNumRowsTable = countNumFetch[0]
print("Number of rows in the table: " + str(countNumRowsTable))
currLimit = 0
cursor1 = conn.cursor() #1
cursor2 = conn.cursor() #2
for x in range(0, countNumRowsTable):
currLimit = currLimit + 1
currLimit1Str = str(currLimit)
senRow1 = cur.execute("SELECT SenNumber FROM SEN_Table ORDER BY SenNumber DESC limit " + currLimit1Str)
cursor1.execute("SELECT SenNumber FROM SEN_Table ORDER BY SenNumber "
"DESC limit " + currLimit1Str) #3
currLimit = currLimit + 1
currLimit2Str = str(currLimit)
senRow2 = cur.execute("SELECT SenNumber FROM SEN_Table ORDER BY SenNumber DESC limit " + currLimit2Str)
cursor2.execute("SELECT SenNumber FROM SEN_Table ORDER BY SenNumber "
"DESC limit " + currLimit2Str) #4
assert(senRow1 is senRow2) #5
print('* cursor1: {}'.format(cursor1.fetchall())) #6
print('* cursor2: {}'.format(cursor2.fetchall())) #7
senRow1Num = senRow1.fetchone()[0] # the 1st row of cur, senRow1
# or senRow2 (they are the same)
senRow2Num = senRow2.fetchone()[0] # the 2nd row of cur, senRow1 or
# senRow2 (they are the same)
print(senRow1Num)
print(senRow2Num)
print("")
senDiff = print(senRow1Num - senRow2Num)
print("")
Выход:
Number of rows in the table: 5
* cursor1: [(4,)]
* cursor2: [(4,), (3,)]
4
3
1
* cursor1: [(4,), (3,), (3,)]
* cursor2: [(4,), (3,), (3,), (2,)]
4
3
1
* cursor1: [(4,), (3,), (3,), (2,), (1,)]
* cursor2: [(4,), (3,), (3,), (2,), (1,)]
4
3
1
* cursor1: [(4,), (3,), (3,), (2,), (1,)]
* cursor2: [(4,), (3,), (3,), (2,), (1,)]
4
3
1
* cursor1: [(4,), (3,), (3,), (2,), (1,)]
* cursor2: [(4,), (3,), (3,), (2,), (1,)]
4
3
1