Телеграм бот на Python / #4 - SQLite3. Подключение к базе данных
HTML-код
- Опубликовано: 7 июн 2024
- За урок вы выполните подключение базы данных к вашему Телеграм Боту. Вы подключите БД SQLite3, но в будущем по схожему принципу сможете подключать любые другие БД.
✅ Полезные ссылки:
- Урок на сайте itProger: itproger.com/course/telegram-...
⏰ Тайм-коды:
00:00 - Начало
01:10 - Подключение SQLite3
03:10 - Создание таблицы
06:15 - Получение имени и пароля
10:00 - Добавление пользователя в БД
17:05 - Список всех пользователей
21:20 - Заключительная часть
✔ Сообщество программистов: itproger.com/
✔ -------------
Вступай в группу Вк - prog_life 🚀
Группа FaceBook - goo.gl/XW0aaP
Инстаграм itProger: / itproger_official
Instagram: / gosha_dudar
Telegram: t.me/itProger_official
Twitter - / goshadudar
- Уроки от #GoshaDudar 👨🏼💻
- Все уроки по хештегу #goshaLessons
Спасибо огромное за курс! После django и других работ, это кажется просто кайфом.Я очень жду продолжения!! Удачи
Это лучший ютубер которого я видел ты очень круто объясняешь темы очень крутой курс смотрю каждое видео и повторяю ща тобой пытаюсь разобраться в каждой строчке очень долго искал такого и не мог найти но ты делаешь невероятное) спасибо большое,удачи в развитии канала
Супер тема!!! Очень полезно для меня. Спасибо большое!
Ребята огромная вам благодарность что так круто преподаете все!!!! Спасибо большое отличный курс!
курсы хорошие, но в этом видео большая путанница с базой данных, и автор усложнил заполнение полей
Чтобы не плодить лишний раз глобальные переменные, можно передавать третьим аргументом имя пользователя
bot.register_next_step_handler(message, fill_user_pass, name)
в этом случае функция fill_user_pass будет принимать не один аргумент - message, а два, например, user_name.
def fill_user_pass(message, user_name):
Так можно увеличивать их количество от функции к функции, но лучше эти объекты организовывать в список или словарь
Да, это хорошее решение. Только в случае, когда у тебя много параметров, ты заколебешься их прописывать. В этом случае уже с глобальными можно
Нельзя использовать глобальные переменные в проектах в которых есть несколько пользователей.
Потому что если будет параллельно выполняться несколько запросов, нужные данные просто попадут в другой id !
Гоша, привет. Очень круто.
А так курсы топ, спасибо Гоше!
Уроки супер, очень легко и понятно. Рахмет!
"Рахмет" это спасибо? И если да, то на каком языке?
@@Beik0 Казахский язык 🇰🇿
@@user-oh8yh7gy5f спасибо
Спасибо за видео!
Я думаю переменную name лучше делать не глобальной, а передавать из функции user_name в user_pass напрямую. Можно третьим аргументом в метод bot.register_next_step_handler(message, user_pass, name) добавить. Там бесконечное количество переменных можно передавать таким образом.
без библиотеки не будет работать???
@@alihansadulaev4351 Без какой? Зачем библиотека для этого?
Спасибо за видео! У меня вопрос, как отчистить список пользователей?
Чтобы избежать ошибки
sqlite3.OperationalError: no such column:
нужно было просто добавить кавычки
f'INSERT INTO users (name, pass) VALUES ("{user_name}", "{password}")'
а ещё лучше вообще не использовать f-строки в SQL-запросах, поскольку это небезопасно и в целом является неприемлемой практикой
@@user-zw9cl2lj6h а чем обычная строка безопаснее f-строки?
@@Markisi0, читал, что f-строки уязвимы перед SQL-инъекциями
вай брат спасибо как ты написал работает как он написал выдает sqlite3.OperationalError: 1 values for 2 columns, не знаешь что делать в таком случае?
@@AlexGold пожалуйста! Судя по описанию ошибки, у тебя идёт попытка вставить одно значение в 2 колонки, то есть забыл где-то второе значение указать. Количество значений должно соответствовать количеству столбцов
У меня вопрос 8:24 почему когда вы снова ввели /start то сообщение не появилось, оно же вроде не должно обрабатывать в 1 раз вы вели старт или во 2 раз
Thanks.
почему у меня на 5:22 не поменялся цвет с зеленого на такой как в ролик?
Скорее всего у него пользовательская тема, которая перекрашивает текст в разные цвета даже не смотря на кавычки, если это SQLite3 команда. У меня тоже так, так как я не устанавливал темы
лучший
ошибка на 15:25 была связана с синтаксисом SQL, можно было просто обрамить в двойные кавычки вот так (я так и исправил и сработало, а уже потом увидел ваше решение):
cur.execute(f'INSERT INTO users (name, pass) VALUES ("{name}", "{password}")')
если я хочу сделать допустим бота который будет хранить некие данные пользователя, как сделать так, чтобы каждому пользователю присваивалась своя бд?
Тебе нужно просто создать таблицу с атрибутами id, user_name, user_id.... (И какие хочешь данные) и просто делаешь запросы на пример по user_id(т.к он уникален у каждого пользователя телеги) и с него берёшь всё данные которые тебе нужны
Подскажите пожалуйста, как можно подсвечивать SQL команды в PyCharm Community? Может плагин дополнительный нужен.
У телеграма есть ограничения, например на кол-во сообщений в секунду, как будете обрабатывать тротл?
отправится второе сообщение с тем, что не вместилось в первое
Надеюсь тут будет про хостинг бота и базы, а то у меня с этим постоянно проблемы
Привет, у меня та же проблема. Ты нашёл решение?
@@alovian7541привет за 2 месяца нашел решение?
У меня почему то не раскрашивается работа с sqlite3.Как исправить?
CREATE TABLE IF NOT EXISTS users (id int auto_increment primary key, name varchar(50), pass varchar(50))
Вот это почему то пишется полностью зеленым а не так как на видео.
Тоже самое. Смог решить проблему?
@@standoff2_yt77 не смог.Как я понял это из за того что это бесплатная версия и некоторые функции недоступны(
@@czdiejengco нет, у меня тоже самое, оно должно работать. У меня тоже зелёное, но робгтает
Нашли решение? У меня тоже самое...
'CREATE TABLE IF NOT EXISTS qarizdarlar (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(50))'
Когда будет видео про новый обновленный движок годот 4?
Друг мой,привет.Полезнве знания,я начинаю свой путь с твоих уроков. Скажи пожалуйста,таблица со списком пользователей доступна только разработчику? А то будет не очень,если у пользователя будут выводиться ники и пароли других юзеров)
привет, можно сделать такую функцию для админа, а у обычных пользотваелей убрать
почему при создании таблицы, в cure.execute весь текст внутри зеленый, int не воспринимает, как исправить, и почему нельзя сразу в видео показать, что нужно доп установить для работы в пайчарм
Нашёл ответа??
Ребята, подскажите, почему callback_data у меня вообще не работает? всё сделал как в видео, но почему-то вообще не работает(кнопка показывается, но ничего не вызывается)
нашел ответ?
Доброго вечера, а можно урок как в телеграм боте отправлять новости. ? К примеру создать простого бота который будет отправлять на Гугл диск для прайсов на товар. А если мы обновили прайсы то мы это как новость написала в боте, и всем кто использует бот в чат пришло уведомления
Возможно ли как то открыть sql таблицу созданную в коде в приложении SQLiteStudio?
Да
как сделать так, что б в кавычках тоже была подсветка синтаксиса, как на видео? У меня вся строка - 'CREATE TABLE IF...' зеленого цвета, ошибки не подсвечиваются(((
такая же фигня
короче я пишу в vs коде я просто скачал ультилиту SQlite и всё заработало
Почему у меня при создании таблицы, когда в кавычки ввожу команду, ничего не работает? Строка даже не подсвечивается
у меня
|table users has no column named name |
что делать?
такая же проблема
ПОМОГИТЕ, что делать, если программа, после того как я ввожу старт в боте, не может найти атрибут коннект?
++
Помогите ! После того как 1-ый пользователь был создан и добавлен в базу данных - если перезагружаю телеграмм бота, то он уже не предлагает регистрировать пользователя, а просто показывает список с 1-ым пользователем. Только после удаления базы данных, можно повторить процедуру. В чём может быть проблема?
А это не проблема. Файл БД хранит данные независимо от перезагрузки бота. Надо тогда удалять юзера, напр. прописать в коде что при остановке бота БД очищается.
Ребята, а подскажите как сделать, чтоб вот эта получившаяся база отправлялась мне в личку, а не отображалась в диалоге пользователя и бота? Можно допустим оставить кнопку скажем (отправить) и при нажатии база уходила бы сообщением на мой акк в телеге. И еще прикольно было бы, чтоб в базу записывалась дата и время. Но это я думаю сам сделаю )))
Сперва начал проходить курс питону у одного блогера, не понравилось перешёл к Гоше и тут всё прекрасно.
Начал проходить тут связанный с ботами и понял, что пора искать другой канал.
Ощущение, что ты просто постарался сделать максимально ёмко эту работу. Просто напихал всего без особых объяснений.
Курс по Питону был прекрасен, а здесь наскоряк что то слепленное.
И пожалуйста, если ты пишешь код ,а он не работает - не показывай его. Ты просто издеваешься над нами. Мы переписываем, пытаемся разобраться как работает. Ты запускаешь и....оно просто не работает. Так вырежи это, зачем тратить время и силы
Спасибо за курс по питону, но этот курс, я пожалуй, пройду в другом месте
4:14 как переходит из строки в команду?
не могу понять, почему у меня кнопка старт не отображаться в боте
+ почему то при создании новой записи у меня в нее ID b Name пишутся как null
Почему когда я очищаю историю у меня нет кнопки Start
Что произошло на 4:04? 12 строка cur.execute() прописывается зеленым шрифтом и ничего не делает.
тоже самое
sqlite3.OperationalError: неполный ввод, вот такая вот ошибка
может быть обновили модуль...
Скорее всего вы используете бесплатную версию пайчарм, в которой не поддерживается база данных sql
Почему нет описания функции?🕵️♂️
А как эту таблицу отчистить потом?
Как сделать вечные кнопки? У меня они один раз нажимаются, а дальше не работают
Там обработчик событий, срабатывает и на кнопки кидает. А в функции кнопок не прописано, что делать, после того как кнопка нажата
Думаю на Ruby! вигляд малоб кращий.
А так норм)
Гоша, здраствуйте!
Я использую пайтон в Visual Studio (от Microsoft), но когда я ввожу "import telebot" выдает ошибку и соответственно дальше код не действителен, что делать в такой ситуации?
@@user-nw3ed8hx5d Спасибо большое
@@skzoneloveee чуваак, что он ответил? у меня такая же проблема
@@alihansadulaev4351 он написал "Напиши в консоли pip import telebot" если не ошибаюсь, я уже не помню😅
Ты его не установил
no such table: users чо делать подскажите пж
Я сейчас скажу возможно не самое популярное мнение, но все таки - sqlite3 не сработает по модели mysql, там есть свои моменты, например: id auto_increment p...k, - не будет вводить значения в таблицу, при выборке мы получим значение None, избежать этого можно так - id primary key, name varchar(50), ... либо так - id primary key autoincrement, name varchar(50), ... во втором случае знак "земля" в слове autoincrement не нужен, иначе будет ошибка синтаксиса.
точнее id integer primary key autoincrement. другие варианты у меня не работали
@@evgeniyo2560 4 часа изнасилования мозга и я пришел в комменты поделиться мудростью, чтобы обнаружить, что кто-то уже ответил
Знаете, что находит гугл по запросу sqlite primary key Null? Нифига он не находит
Если у вас на моменте 7:42 выдало ошибку:
cur.execute(f'CREATE TABLE IF NOT EXISTS users (id int auto_increment primary key, name varchar(50), pass varchar(50)')
sqlite3.OperationalError: incomplete input
Решение:
Надо просто использовать другой способ форматирования строки, например, конкатенацию строк:
query = 'CREATE TABLE IF NOT EXISTS users (id int auto_increment primary key, name varchar(50), pass varchar(50))'
cur.execute(query)
Ответ мне помогла найти GPT, поэтому я сам не до конца догнал почему это так работает, а как Гоша написал не работает... GPT внятно не ответила...
ГОША ПОМОГИ ПОЖАЛУЙСТА ПОНЯТЬ почему так?
спасибо!
Не получается. Пишет что нужен пайтон профессионал для использования sql
В sqlite нет varchar(50). Есть только text, а ограничение прописывается отдельно, иначе не будет работать
В документации по psycopg2 написано что нельзя использовать конкатенацию строк(+) или интерполяцию строк(f-строка), возможно это относиться и к SQLite3
Да, в sqlite это тоже делать нельзя, так как это создаёт уязвимость для sql-инъекций. Для таких случаев нужно использовать параметризированный запрос в рамках метода execute
Что делать если 'CREATE TABLE OF NOT EXISTS' остаётся зелёного цвета, а так же при запуске не создаётся папка с расширением sql как указано в видео
У тебя ошибка, не OF а IF. У меня тоже команда остается зелёного цвета, но всё работает
а как очистить эту строку?
Почему может переменная name быть None а не то что пишу в тг бот
Пишет: sqlite3.OperationalError: database is locked
объясняешь круто, но я бы просто передал name 2 значением.
не показывает списка пользователей в телеграмме что делать?
У меня, после нажатия на список пользователей, выводит две одинаковые стоки с именем и паролем. из за чего может быть?
из-за того, что при двух стартах бота вводил один тот же пароль и логин
форматирование через f строку открывает возможность для sql инъекций!!!!!!!!!
появилась проблема в том что этот список не открывается даже если все правильно..
cur.execute('CREATE TABLE IF NOT EXISTS users (id int auto_increment primary key, name varchar(50), pass varchar(50)')
sqlite3.OperationalError: incomplete input
помогите пожалуйста, что не так?
Закинь в чат GPT
Вот что мне ответил чат GPT:
The code snippet is missing a closing parenthesis ')' for the CREATE TABLE statement. The correct code should be:
cur.execute('CREATE TABLE IF NOT EXISTS users (id int auto_increment primary key, name varchar(50), pass varchar(50))')
Note the closing parenthesis at the end of the statement.
У нас с тобой не хватает еще одной скобки перед закрывающим апострофом '
@@DadundddaD се равно также
крч там еще 1 скобку напиши в конце
@@DadundddaD кстати заработало, но у меня оно зелёным подчеркнуто)
Гоша, почему у меня это поле с Execute просто зеленое внутри скобок, как обычный текст? А у тебя выделено как команды. При том, что всё равно работает. Что это?
привет, решил проблему? просто у меня такая же беда
Скорее всего вы используете бесплатную версию пайчарм, в которой не поддерживается база данных sql
Привет👋 У него текст выделен как ошибка.
Это наверное просто плагин такой. Его можно скачать в пайчарме.
Не подсвечивается желтым после "execute". Что делать??? Не работает как в видео
Ты нашел ответ? Если да то подскажи пожалуйста в чем проблема
Почему то не работает. Строка, там где cur.execute('CREATE TABLE IF NOT EXISTS users (id int )'), она не становится желтой и не работает, она просто тупо зеленая
cur.execute('CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(50), password VARCHAR(50))')
Попробую это ввести должно заработать.
@@fovir_fresh спасибо
а как задеплоить бота вместе с базой данных? я пытаюсьзадеплоить обычного бота- вышло. А тот что с базой данных - не вышло
То же самое, сама база данных почему-то не обновляется после выргрузки бота на сервер. Давай если кто-то из нас найдёт решение, друг другу напишем его
уже нашел. Отключи все консоли, и заново запусти бота. И впиши в бота прокси
@@user-ex2wd8kv1h ого, а ты получается вообще с хоста убрал бот? И какой прокси используешь? Поделись пожалуйста
я хз честно, мне чел дал куок кода, я вставил и заработало.
@@alovian7541
16:30 у меня так не работает, я сделал так:
cur.execute("""INSERT INTO users(name, pass) VALUES(?, ?)""", (name, password))
Самое первое что я вижу - это 4 кавычки. Ты нафига их 4 поставил? Ставь либо 1, либо двойные.
у многих не поменялся цвет при создании таблицы и у меня в том числе, для тех кто не знает как решить эту проблему, на сколько я понял нужна платная версия пайчарма, у кого другая инфа, буду рад если поделитесь
...в базе данных всё закодировано, поэтому открывать мы ее не будем
а жаль, если бы открыли, то увидели, что у id значения NULL
как вывести ID?
cur.execute('CREATE TABLE IF NOT EXISTS users (id, ...') у меня все условия в скобках считываются как обычная строка, что мне делать?
cur.execute("CREATE TABLE IF NOT EXISTS users (id int auto_increment primary key, name varchar(50), pass varchar(50))")
вот рабочая строка
@@armanvoskanyan816 нет, у меня всё равно строка обычная
Был интересен вот этот вопрос:
coursor.execute("INSERT INTO users (name, pass) VALUES (?, ?)", (name, password))
почему здесь нельзя использовать форматированную строку по типпу f'{name, pass}'
Вот что мне подсказали
Эту штуку нельзя сделать т.к. пользователь мог бы ввести вот такую команду и дропнусть все базу SQL т.к. была бы воспринята как команда
Это называется SQL инъекция вот ее пример:
name = "John'; DROP TABLE users; --"
sql = f"INSERT INTO users (name, pass) VALUES ('{name}', '{password}')"
Да и как заметили вместо симоволов %s оказалось можно использовать ( ?, ?) что чуть чуть удобнее
Как сделать чтобы человек 1 раз ввел регистрацию а потом не вводил?
не очень понял почему, но он все время пишет введите пароль
В теле функции user_name
внутри должно быть bot.register_next_step_handler(message, user_pass)
У меня сначала было написано bot.register_next_step_handler(message, user_name) и выводило бесконечно "введите пароль", пока не заметил
Как включить подсветку внутри кавычек?
Нашёл ответ??
@@MnlopLiolo-gd4meНашли ответи?
TypeError: 'list' object is not callable, вот что мне даёт
Ты используешь handlers а нужно handler
у меня почему-то ошибка на ( callback_data ) кто знает решение?
крч там нужно Button)
В 35 линии неправильно написано вообще все, выдает сранную ошибку, вот исправленный вариант cur.execute('INSERT INTO users(name, password) VALUES (?, ?)', (name, password))
Спасибо уж.
Не помогает. Выдало вот что:
cur.execute('INSERT INTO users(name, password) VALUES (?,?)', (name, password))
sqlite3.OperationalError: no such table: users
Спасибо, лучший
Посмотри в conn = sqlite3.connect() возможно просто не правильно записал сам файл
Пишу cur.execute('INSERT INTO pupils (p_name, p_sname) VALUES (?,?)', (user_name, user_sname )) выдает Error binding parameter 0 - probably unsupported type.
А нельзя было создать подключение к БД в шапке файла перед декораторами самого бота? Тогда в функциях не надо было переписывать кучу одинакового кода. Тогда
with conn:
cur.execute('SELECT.......')
всего надо прописать ну и вернуть cur.execute('SELECT.......') естественно?
Я уже в агонии пишу этот под каждым видео в надежде на помощь.
Мой бот работает с геолокацией получаемой через location но у меня есть необходимость разграничить координаты полученные через геолокацию телефона и координаты полученные через кнопку телеграм "выбрать вручную", которая появляется если отключена геолокация на телефоне
К chat gpt обращался?
@@zhabitok послал меня и сказал только обычная локация request_location
Здравствуйте, подскажите пожалуйста. Я новичок, хочу написать программу небольшую и у меня возник вопрос. например 1: как тебя зовут? 2: Иван(а) 1: сколько тебе лет? 2; 12 лет(б). 1; Меня зовут (а) и мне (б). как это сделать? в питоне? чтобы быть в последнем сообщении отсылку делать на сообщения. могу код прислать,если надо. подскажите пожалуйста
Это в телеграмм боте?
Кто может помочь создать бота
Что делать если не создается файл??????
Такой же вопрос ты тоже с pydroid работаешь
cur.execute(f"INSERT INTO users (name, pass) VALUES('{name}', '{password}')")
sqlite3.OperationalError: no such table: users
КАК ИСПРАВИТЬ ДАННУЮ ОШИБКУ?
ты ролик досмотрел ? там все у него тоже ошибка была из за данной строки и он сменил ее
cur.execute("INSERT INTO user (name, pass) VALUES (?, ?)", (name, password))
Нужно посмотреть в самом начале, где обращается к cur.execute и найти что написано в этой строке. И исправить на users.
не получилось создать таблицу с sql, кто знает решение проблемы?
что не получилось?
Один моментик, я решил вывести не только имя и пароль, но и id. В сообщении во всех строках было написано ID: None
+
то же самое
нужно прописать id INTEGER PRIMARY KEY AUTOINCREMENT
@@user-jb9jy6hn5e спасибо, хоть и спустя 5 месяцев
Можете подсказать - создатель бота получает IP пользователя телеграм?
Kai Angel feat 9mice - SPRAY
а что будем делать, когда пользователей будет больше, чем вместится в одно сообщение?)
Отправиться второе сообщение в котором будет то, что не вместилось в первое
Зачем вообще отправлять пользователю список пользователей? Он же это просто для примера показал
@@zp4355 Это зависит от ТЗ. Иногда нужно, например, не влезая в интерфейс управления бд - назначить админа, или изменить его роль. Вариаций масса
Как добавить в бота оплату? Типо киви
Это будет в каком то из видео из этого курса
я не понимаю почему у меня после того как ввел пароль пишет опят ьвведите пароль и так до бесконечности
тоже самое ! как решил ?
@@7hsjshaba сорян, не помню, могу код скинуть
@@user-km2gr9mf9q было бы супер
13:30
Как зделать 5 конечную звезду как в видео 21:05 в 50 строке
Кто нибудь помогите!!!!!! Как устранить ошибку unable to resolve table “users”
Чату GPT скорми код и спроси насчёт ошибки, он поможет наверняка
Ничего не работает 😢
Все работает
ребят мой вам совет. зачастую все ваши проблемы в коде это из-за не внимательности.
В 7:30 комманда
cur.execute('CREATE TABLE IF NOT EXISTS users (id int auto_increment primary key, name varchar(50), pass varchar(50)')
мне выдавало ошибку по типу: sqlite3.OperationalError: и тд
так вот. у меня ошибка была в том что я просто забыл закрыть скобки в конце...
Для вас задание где я ошибся в коде...
Привет, почему именно telebot ,а не aiogram?
Он легче для понимания
@@twwisty3403 aiogram асинхронный, а telebot нет, зачем учить полное г@вно ????
@@user-go9sv1id2n ясным язык было сказано, он легче для понимания и с каких пор асинхронность показатель величия
@@user-go9sv1id2n это не полное говно, надо знать и первое и второй.
@@user-go9sv1id2n что такое асинхронный?
автор просто меняет кавычки на двойные
я: что здесь бл происходииииит!!!!
Можно было не мудрить с %. Вот так все заработало
cur.execute(f"INSERT INTO users (name, pass) VALUES('{name}', '{password}')")
окей а как потом очистить этот список??
users.clear() 😀😀😀😀
DELETE * FROM users
@@funnylaunchpad3609 пишет ошибка синтаксиса возле *
Чувак, конструктивчик:
1. Организуй список или словарь.
2. Я понимаю, что питон - язык с динамической типизацией, но очень режут глаза одинарные кавычки.
3. Залог качественного и читабельного кода - это, когда у тебя есть ряд функций и они исполняют по одной индивидуальной задаче. Когда захламляешь код такими функциями а-ля user_pass, в которой ты и пароль принимаешь и записываешь ВСЕ данные в базу, ну такое. Будь это реальный проект можно было бы ой как сильно потеряться в подобных методах.🙃
О