@flys_1

Как решить данную проблему с SQLite?

Выдаёт ошибку
"UnboundLocalError: local variable 'singup' referenced before assignment"
.
P.S я знаю что ошибся в слове "signup" но дело не в этом.

import sqlite3

class Database:
    def __init__(self, db_file):
        self.connection = sqlite3.connect(db_file)
        self.cursor = self.connection.cursor()

    def add_user(self, user_id):
        with self.connection:
            return self.cursor.execute("INSERT INTO 'users' ('user_id') VALUES (?)", (user_id,))

    def user_exists(self, user_id):
        with self.connection:
            result = self.cursor.execute("SELECT * FROM 'users' WHERE 'user_id' = ?", (user_id,)).fetchall()
            return bool(len(result))
    def set_nikname(self, user_id, nickname):
        with self.connection:
            return self.cursor.execute("UPDATE 'users' SET 'nickname' = ? WHERE 'user_id' = ?", (nickname, user_id,))

    def get_singup(self, user_id):
        with self.connection:
            result = self.cursor.execute("SELECT 'singup' FROM 'users' WHERE 'user_id' = ?", (user_id,)).fetchall()
            for row in result:
                singup = str(row[0])
            return singup

    def set_singup(self, user_id, singup):
        with self.connection:
            return self.cursor.execute("UPDATE 'users' SET 'singup' = ? WHERE 'user_id' = ?", (singup, user_id,))
  • Вопрос задан
  • 113 просмотров
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
for row in result:
    singup = str(row[0])

Молчаливо подразумевает, что в result будет хотя бы одна строка. Это далеко не факт.
Если result пуст, то singup не будет присвоено значение.
Ответ написан
Комментировать
@o5a
Как уже объяснили, если пользователя нет, то и данных не возвратит, в результате цикла не будет. Простым изменением можно просто возврат результата внести внутрь цикла:
...
            for row in result:
                singup = str(row[0])
                return singup

или же напрямую
...
            for row in result:
                return str(row[0])

В таком случае если пользователь есть, то вернет его данные. Если нет, то None. И если специальные параметры соединения не указывали, то row итак возвращает текстом, так что можно просто:
return row[0]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы