Итерации по кортежам базы данных SQLite, не совпадающим с вводом пользователя - PullRequest
0 голосов
/ 05 августа 2020

У меня есть небольшая база данных с одной таблицей с именем cards.

  • Столбец number равен TEXT.
  • У меня несколько строк, и я пытаюсь получить Пользовательский ввод вводит строку

Например:

    connection = sqlite3.connect('card.s3db')
    cursor = connection.cursor()

    card_check = cursor.execute('SELECT number FROM card')

    connection.commit()

    prompt_card_number = input("Enter your card number:\n")

    for number in card_check:
        if number == prompt_card_number:
            check_stage2()
    else:
        print("\nWrong card number or PIN!")

    connection.close()

По какой-то причине я ввожу соответствующий номер карты в базу данных, но все равно получаю Wrong card number or PIN! и не могу пройти check_stage2(). Что я делаю не так?

Изменить: Хорошо, теперь я попробовал этот код:

def check_stage1():
    connection = sqlite3.connect('card.s3db')
    cursor = connection.cursor()

    cursor.execute('SELECT number FROM card')
    card_check = cursor.fetchall()
    print(card_check)

    prompt_card_number = input("Enter your card number:\n")

    for number in card_check:
        if number == prompt_card_number:
            # account_interface()
            print("ok")
    else:
        print("\nWrong card number or PIN!")

    connection.commit()
    connection.close()

И card check возвращает список таких странных кортежей, как этот [('4000006601632606',), ('4000006102182200',), ('4000009048898194',), ('4000006526735435',), ('4000002961735386',), ('4000008741268614',), ('4000001893515676',)] Но я не Я не знаю, как пройти через это. Кажется, что это все равно не работает, если я ввожу правильный номер.

Редактировать 2: Я узнал, как перебирать кортежи, но все равно получаю Wrong card number or PIN!, даже если тип number [0] - str , и я тоже ввел str. Смотрите этот код:

def check_stage1():
    connection = sqlite3.connect('card.s3db')
    cursor = connection.cursor()

    cursor.execute('SELECT number FROM card')
    card_check = cursor.fetchall()
    print(card_check)

    prompt_card_number = input("Enter your card number:\n")

    for number in card_check:
        if number[0] == prompt_card_number:
            # account_interface()
            print(number[0])
            print(type(number[0]))
    else:
        print("\nWrong card number or PIN!")

Возвращает Enter your card number: 4000009048898194 <class 'str'> описательное изображение

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Через некоторое время мне удалось это решить. Все, что мне нужно было сделать, это выяснить, что мне пришлось использовать cursor.fetchall(), чтобы выгрузить строки, и я назначил его переменной, чтобы увидеть, что в нем содержится, оказалось, что это был список кортежей.

card_check = cursor.fetchall()
print(card_check)

Отсюда я перебирал список с a for l oop выбирая индекс кортежа, 0 вот так:

    for number in card_check:
        if number[0] == prompt_card_number:
            print("ok")
            check_stage2()
            break
    else:
        print("\nWrong card number or PIN!")

Теперь все работает нормально.

0 голосов
/ 05 августа 2020

execute возвращает кортеж независимо от того, выбран ли один столбец или сто. number не то, что вы думаете в этом предложении if number == prompt_card_number:

...