Python SQlite. Переменная LIMIT не меняет значение в цикле - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь найти разницу в количестве SEN студентов в каждом ряду.(код, выходные данные и таблица базы данных внизу)

Что я сделал:

Finding the number of rows in a table.

Initializing the LIMIT number to 0 BEFORE the loop starts.

I then add one to LIMIT and output it as a string.

I then select the number of SEN students at LIMIT currLimitStr 

I then add one to LIMIT and output it as a string.

I then select the number of SEN students at LIMIT currLimitStr 

I then fetch this data and print it out.

The loop starts again.

Увеличивая currLimit 2, каждый цикл работает, НО по какой-то причине одни и те же значения senRow1 иsenRow2 используются после каждого цикла.Почему это так

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
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)
    currLimit = currLimit + 1
    currLimit2Str = str(currLimit)
    senRow2 = cur.execute("SELECT SenNumber FROM SEN_Table ORDER BY SenNumber DESC limit " + currLimit2Str)

    senRow1Num = senRow1.fetchone()[0]
    senRow2Num = senRow2.fetchone()[0]
    print(senRow1Num)
    print(senRow2Num)
    print("")
    senDiff = print(senRow1Num - senRow2Num)
    print("")

Вывод:

enter image description here

Таблица базы данных:

enter image description here

1 Ответ

0 голосов
/ 25 апреля 2018

Я не очень понимаю, чего вы хотите, поэтому я не могу помочь вам достичь этого. Надеюсь, я смогу помочь вам понять, почему ваш код делает то, что делает.

Я добавил несколько строк в ваш код и пометил их цифрами #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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...