Ошибка синтаксиса у несуществующего символа

Я пишу телеграм бота с локальной базой данных sqlite3. При попытке извлечь данные из таблицы для проверки регистрации пользователя в боте выдает ошибку.

def bot_start(message):
    connection = sqlite3.connect('users.db')
    db = connection.cursor()

    db.execute("""CREATE TABLE IF NOT EXISTS users (
        telegram_user TEXT,
        rollgame_account TEXT,
        username TEXT,
        telegram_id INT

    )""")
    connection.commit()

    if db.execute("SELECT telegram_user FROM users WHERE telegram_id = {}".format(id)).fetchone()[0] == 'yes':
        client.register_next_step_handler(msg, bot_menu)
    else:
        client.register_next_step_handler(msg, bot_user_authorization)

Ошибка:

Traceback (most recent call last):
  File "bot.py", line 66, in <module>
    client.polling(none_stop = True, interval = 0)
  File "C:\Users\sakae\AppData\Local\Programs\Python\Python37-32\lib\site-packages\telebot\__init__.py", line 485, in polling
self.__threaded_polling(none_stop, interval, timeout, long_polling_timeout)
  File "C:\Users\sakae\AppData\Local\Programs\Python\Python37-32\lib\site-packages\telebot\__init__.py", line 544, in __threaded_polling
raise e
  File "C:\Users\sakae\AppData\Local\Programs\Python\Python37-32\lib\site-packages\telebot\__init__.py", line 507, in __threaded_polling
self.worker_pool.raise_exceptions()
  File "C:\Users\sakae\AppData\Local\Programs\Python\Python37-32\lib\site-packages\telebot\util.py", line 117, in raise_exceptions
raise self.exception_info
  File "C:\Users\sakae\AppData\Local\Programs\Python\Python37-32\lib\site-packages\telebot\util.py", line 69, in run
task(*args, **kwargs)
  File "bot.py", line 25, in bot_start
if db.execute("SELECT telegram_user FROM users WHERE telegram_id = {}".format(id)).fetchone()[0] == 'yes':
sqlite3.OperationalError: near "<": syntax error

Символа "<" в моем коде нет.


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

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

Ошибка возникает из-за того, что запрос вы формируете так:

"SELECT telegram_user FROM users WHERE telegram_id = {}".format(id)

У вас в коде нигде не объявлена переменная id.

Но зато в питоне id - это встроенная функция. А если вы любую встроенную функцию попытаетесь привести к строке, то увидите такое:

<built-in function id>

Вот отсюда и берётся <.

Скорее всего у вас вместо id должно быть что-то вроде message.id или подобное (я не разбираюсь в телеграмных ботах, поэтому точнее не подскажу).

→ Ссылка