cur.fetchone()[0] внезапно становится нетипичным

#python #error-handling

Вопрос:

Я создаю систему входа в систему в качестве базы данных, используя SQLite.

 def loginfunction(self):
    user = self.emailfield.text()
    password = self.passwordfield.text()

    if len(user)==0 or len(password)==0:
        self.error.setText("Please input all fields.")

    else:
        conn = sqlite3.connect("shop_data.db")
        cur = conn.cursor()
        query = 'SELECT password FROM login_info WHERE username ='' user "'"
        cur.execute(query)
        result_pass = cur.fetchone()[0]
        if result_pass == password:
            print("Successfully logged in.")
            self.error.setText("")
        else:
            self.error.setText("Invalid username or password")
 

Когда я запускаю его, если пароль не совпадает с именем пользователя из базы данных, он работает, но если я введу неправильное имя пользователя, приложение закроется и распечатает это

 main.py", line 38, in loginfunction
result_pass = cur.fetchone()[0]
TypeError: 'NoneType' object is not subscriptable
 

Вот что говорит журнал SQLite как выглядит база данных база данных

Ответ №1:

fetchone делает

Извлекает следующую строку результирующего набора запроса, возвращая одну последовательность или None когда больше нет доступных данных.

Для любого

 'SELECT password FROM login_info WHERE username ='' user "'"
 

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

 query_result = cur.fetchone()
if result_pass is None:
    print("Username with given name is not known")
    # action to undertake in such case
result_pass = query_result[0]
 

затем продолжайте, как и ранее