sqlite3 выдает значение, как список. Но python думает что он ничего не выдал и выдает ошибку. Как это исправить?

Код команды discord.py:

@commands.command()
    async def welcome(self, ctx, arg: str = None, arg2: int = None, *, arg3: str = None):
        try:
            for value in cursor.execute(f"SELECT owner_id FROM servers WHERE id={ctx.guild.id}"):#получаю id овнера сервера из таблицы sqlite3
                owner_id = value#записываю id в переменную
            owner_id = re.sub("[(|)|,|']", "", str(owner_id))#убираю лишние символы, т.к. slite3 выдает список
            owner_id = int(owner_id)
            if ctx.author.id == owner_id:#сравниваю id автора с id в переменной
              #дальше идет мой код

Но выдает ошибку:

discord.ext.commands.errors.CommandInvokeError: Command raised an exception: UnboundLocalError: local variable 'owner_id' referenced before assignment

Ответы (1 шт):

Автор решения: gil9red

У вас переменная создается в цикле, но если не будет итераций цикла, то она не будет создана, из-за чего и возникает та ошибка при попытке использовать переменную

Я бы убрал цикл, т.к. не может быть у вас несколько объектов с одним id, используя fetchone. А значения в запрос лучше привыкнуть передавать через параметры ?

Пример:

value = cursor.execute("SELECT owner_id FROM servers WHERE id=?", [ctx.guild.id]).fetch_one()
owner_id = value[0] if value else None
if ctx.author.id == owner_id:#сравниваю id автора с id в переменной
    # дальше идет мой код

Но, в value будет None, если в таблице не будет сервера с указанным id, поэтому лучше предусмотреть вариант и проверять (поэтому добавил проверку value[0] if value else None)

→ Ссылка