Ответы пользователя по тегу SQLite
  • Проблемка с fetchall(). Можете помочь?

    shabelski89
    @shabelski89
    engineer
    Читаем учебник, а не пишем ботов. Что такое кортежи, списки, срезы.
    example = ('Valentine',)
    example[0]
    'Valentine'
    Ответ написан
    Комментировать
  • Как передать значение в команду sqlite3?

    shabelski89
    @shabelski89
    engineer
    кровь из глаз :)
    cur.execute("SELECT COUNT(*) FROM users WHERE ? = 1 OR ? = 1 ", ("n7","n8" ))
    xxx = cur.fetchall()
    Ответ написан
    Комментировать
  • Как удалять пользователя из бд после того, как он удалил бота в телеграмме?

    shabelski89
    @shabelski89
    engineer
    О том что он удалил, можно узнать только когда бот отправит сообщение и получит ексепш что он удалён.
    Нужно перехватить exception и вызвать удаление из БД.
    try:
        bot.send_message(user_id, text)
    except telebot.apihelper.ApiException:
        logging.exception(f'Send Notification ERROR - {telebot.apihelper.ApiException}')
        delete_user(user_id)


    где вызывается удаление пользователя из БД, где он вероятно есть для рассылки.
    def delete_user(user_id):
        del_user_query = f'DELETE FROM {users_t} WHERE {users_col["user_id"]} = {user_id};'
        post_sql_query(del_user_query)
    Ответ написан
    Комментировать
  • Как добавлять кнопки в клавиатуру в зависимости от данных из базы данных в Telebot?

    shabelski89
    @shabelski89
    engineer
    Предположим Вы знаете как из sqlite полчать данные, обычно при fetchall() получаем список кортежей, например такой: some_data_from_sqlite = [('one',), ('two',), ('ten',)] .
    а уж клавиатуру сделать проще простого:
    import telebot
    from telebot import types
    
    
    API_TOKEN = ""
    bot = telebot.TeleBot(API_TOKEN)
    
    
    @bot.message_handler(commands=['start'])
    def start(message):
        some_data_from_sqlite = [('one',), ('two',), ('ten',)]  # список кортежей из БД
        buttons_dict = {i: x[0] for i, x in enumerate(some_data_from_sqlite)}
        keyboard = types.InlineKeyboardMarkup()
        back_button = types.InlineKeyboardButton(text="Back", callback_data="MainMenu")
        button_list = [types.InlineKeyboardButton(text=x, callback_data=x) for x in buttons_dict.values()] # callback дата понадобится при обработке нажатий на кнопку, но это уже совсем другая история :)
        keyboard.add(*button_list, back_button)
        bot.send_message(chat_id=message.chat.id, text=message.text, reply_markup=keyboard)
    
    
    if __name__ == "__main__":
        try:
            bot.polling(none_stop=True)
        except Exception as e:
            print(e)
    Ответ написан
    5 комментариев
  • Как в базе данных SQLite3 к столбцу добавить autoincrement?

    shabelski89
    @shabelski89
    engineer
    Попробуйте так
    DELETE FROM animal;
    DELETE FROM sqlite_sequence WHERE name = 'animal';

    потому пробуйте
    cursor.execute("INSERT INTO animal (kind, species, birth_day, weight) VALUES (?, ?, ?, ?)", (kind1, species1, birth1, weight1))
    Ответ написан
    Комментировать
  • Как вывести номер строки БД SQLite3 как переменную?

    shabelski89
    @shabelski89
    engineer
    Вот тут писал для кого-то пример на ткинтер работы с sqlite.
    Там все нужные вам CRUD.
    То есть методы внесения данных и получения ) ну и отображения
    Ответ написан
    Комментировать
  • Использование sqlite3 И tkinter и создание базы данных?

    shabelski89
    @shabelski89
    engineer
    Задачка показалась интересной, код доступен на гитхаб.
    Выполняются все основные требования, много дубля кода удалено, но всё равно далёк от идеала)
    Ключевой момент, что для решения задачи достаточно было бы использование listbox, потому что treeview подразумевает вложенность. Например курсант и внутри n-строк по предметам.
    Приглашаю допилить .
    5fd7c43a3eafc813983720.png
    Ответ написан
    Комментировать
  • Выбрать несколько условий в запросе SQLite?

    shabelski89
    @shabelski89
    engineer
    cursor.execute('SELECT id FROM users 
    WHERE game_is_true = "True" 
    AND game_is_true2 = "False" 
    AND id != ?', (my_id,))
    Ответ написан
    3 комментария
  • Как решить проблему в telebot/sqlite3?

    shabelski89
    @shabelski89
    engineer
    А поиск? Вот разжевал тут. А вам как минимум в таблицу primary key нужен.
    Ответ написан
    Комментировать
  • Как сделать проверку на наличие определенного числа в базе данных (SQLite)?

    shabelski89
    @shabelski89
    engineer
    По хорошему нужно 2 таблицы и внешний ключ :
    create table `rules` (`id` INT PRIMARY KEY, `rule` VARCHAR(50));
    insert into  `rules` (`id`, `rule`) VALUES (1, 'user');
    insert into  `rules` (`id`,`rule`) VALUES (2, 'moderator');
    insert into  `rules` (`id`,`rule`) VALUES (3,'admin');
                                                               
    create table `users` (`telegram_id` INT PRIMARY KEY, `username` VARCHAR(50), `status` INT, FOREIGN KEY (`status`)  REFERENCES `rules` (`id`));
    insert into  `users` (`telegram_id`, `username`, `status`) VALUES (555, 'user555', '1');     
    insert into  `users` (`telegram_id`, `username`, `status`) VALUES (666, 'user666', '2'); 
    insert into  `users` (`telegram_id`, `username`, `status`) VALUES (777, 'user777', '3');
    insert into  `users` (`telegram_id`, `username`, `status`) VALUES (888, 'user888', '3');


    далее делаем запрос чтобы найти админов:
    select u.username from users u 
    left join rules r
    ON u.status=r.id
    where id=3;


    результат на лицо.5f8498be9255b803207255.png
    Ответ написан
    3 комментария
  • SqlLite. Как воспользоваться оператором like?

    shabelski89
    @shabelski89
    engineer
    Для чего Вам хранение словаря в виде байтовой строки в таблице?
    import sqlite3
    
    
    blob = bytearray(b'{"param1":"1","param2":"2"}')
    
    with sqlite3.connect('np.db') as connection:
        cursor = connection.cursor()
        cursor.execute("CREATE TABLE IF NOT EXISTS t_info_t (blob_Value BLOB )")
        cursor.execute("INSERT OR IGNORE INTO t_info_t (blob_Value) values (?)", (blob,))
        cursor.execute("SELECT * FROM t_info_t")
        data = cursor.fetchall()
        print(data)
        print(type(data[0][0]))
        out = data[0][0].decode()
        print(out)
        print(type(out))
    Ответ написан
    1 комментарий
  • Как убрать лишнее в split?

    shabelski89
    @shabelski89
    engineer
    нужно правильно использовать f-строки
    settings_massive=['text_hello','text_goodbye','text_kick']
    massnum = 1
    number_text = 5
    text_chat = 777
    print(f"Изменяется... {settings_massive[massnum]} {number_text} {text_chat}")
    #Изменяется... text_goodbye 5 777
    Ответ написан
    Комментировать
  • Как записывать только уникальные строки в SQLite?

    shabelski89
    @shabelski89
    engineer
    какая структура таблицы?
    Всё правильно, надо использовать INSERT OR IGNORE, но определить PRIMARY KEY, в данном случае на основе нескольких полей, и тогда через неделю запись добавиться, так как поле play_date другое значение имеет.
    CREATE TABLE IF NOT EXISTS games
    (game TEXT NOT NULL, play_date TEXT NOT NULL, play_time TEXT NOT NULL, 
    team_a TEXT NOT NULL, team_b TEXT NOT NULL, cup TEXT, 
    PRIMARY KEY (game , play_date , play_time ));
    Ответ написан
    1 комментарий
  • Ошибка sqlite3?

    shabelski89
    @shabelski89
    engineer
    Кажется Вы создали модуль с именем sqlite3? Именно он импортируется вместо нужного, переименуйте файл.
    Ответ написан
    Комментировать
  • Как правильно сделать проверку sqlite?

    shabelski89
    @shabelski89
    engineer
    В Вашем случае при вызове каждой из функций не хватает открытия соединения с БД.
    with sqlite3.connect('my.db') as connection:
        cursor = connection.cursor()
        cursor.execute(cmd)

    Я уже приводил пример взаимодействия тут, чтобы минимизировать дублирование кода.

    Далее используются непонятные проверки и преобразования:
    def is_user_warned(user_id: int) -> bool:
    в коде выше используется проверка, если вернулось True то делай, то
    if not is_user_warned(event.obj.reply_message['from_id']):

    не обязательно явно возвращать return result > 0, если result не пустой, то и будет True.
    возвращайте значение, с которым потом можно работать, и что не помешает сделать при этом проверку на пустоту.
    def post_sql_query(sql_query):
        with sqlite3.connect('my.db') as connection:
            cursor = connection.cursor()
            try:
                cursor.execute(sql_query)
            except Error:
                pass
            result = cursor.fetchall()
            return result
    
    
    def is_user_warned(user_id: int):
        cmd = "select count(user_id) from warnlist where user_id = %d" % (user_id)
        result  = post_sql_query(cmd)
        return result
    
    
    if not is_user_warned(event.obj.reply_message['from_id']):
        print('добавить')
    else:
        print('+ 1/3 варн')
    Ответ написан
  • Удалить с базы юзера если 403 bot was blocked by the user?

    shabelski89
    @shabelski89
    engineer
    def post_sql_query(sql_query):
        with sqlite3.connect(database) as connection:
            cursor = connection.cursor()
            try:
                cursor.execute(sql_query)
            except Error:
                print(Error)
            result = cursor.fetchall()
            return result
    
    def delete_user(user_id):
        del_user_query = f'DELETE FROM users WHERE user_id = {user_id};'
        post_sql_query(del_user_query)
    
    try:
        bot.send_message(user_id, text)
    except telebot.apihelper.ApiException:
        delete_user(user_id)
    Ответ написан
  • Телеграм бот. SQlite3 как выводить id?

    shabelski89
    @shabelski89
    engineer
    для начала сделать импорты:
    import sqlite3
    from sqlite3 import Error
    from time import sleep, ctime


    вызов всех SQL выражений сделать через функцию:
    def post_sql_query(sql_query):
        with sqlite3.connect('my.db') as connection:
            cursor = connection.cursor()
            try:
                cursor.execute(sql_query)
            except Error:
                pass
            result = cursor.fetchall()
            return result


    далее нужно создать таблицу в sqlite и в качестве primary key (именно он на уникальность определит) сделать id user:
    def create_tables():
        users_query = '''CREATE TABLE IF NOT EXISTS USERS 
                            (user_id INTEGER PRIMARY KEY NOT NULL,
                            username TEXT,
                            first_name TEXT,
                            last_name TEXT,
                            reg_date TEXT);'''
        post_sql_query(users_query)


    и функцию регистрации пользователя:
    def register_user(user, username, first_name, last_name):
        user_check_query = f'SELECT * FROM USERS WHERE user_id = {user};'
        user_check_data = post_sql_query(user_check_query)
        if not user_check_data:
            insert_to_db_query = f'INSERT INTO USERS (user_id, username, first_name,  last_name, reg_date) VALUES ({user}, "{username}", "{first_name}", "{last_name}", "{ctime()}");'
            post_sql_query(insert_to_db_query )

    а дальше вызывать её из хендлера:
    create_tables()  # вызываем функцию создания таблицы users
    
    
    @bot.message_handler(commands=['start'])
    def start(message):
        register_user(message.from_user.id, message.from_user.username,
                      message.from_user.first_name, message.from_user.last_name)
        bot.send_message(message.from_user.id, f'Welcome  {message.from_user.first_name}' )


    Думаю принцип понятен, далее можно со всеми данными так работать и да код так себе, но должен работать.
    Достаточно подробно?)
    Ответ написан
    8 комментариев
  • Вывод данных из БД в телеграм-бот?

    shabelski89
    @shabelski89
    engineer
    а что сложного подставить переменную в запрос?
    получаете город или что там
    city = message.text
        with db.connect('your.db') as connection:
            cursor = connection.cursor()
            cursor.execute("SELECT * FROM table WHERE row = ?", (city,))
            result = cursor.fetchall()

    если немного доработать то может что-то вроде того:
    def check_city(city ):
        with db.connect('your.db') as connection:
            cursor = connection.cursor()
            cursor.execute("SELECT * FROM table WHERE row = ? ", (city,))
            data = cursor.fetchone()
            if data is None:
                return False
            else:
                return data
    
    test = check_city(message.text)
    if test:
        bot.send_message(user_id, test[0])  # например первое поле из таблицы
    Ответ написан
    Комментировать
  • Почему выдаёт ошибку с кол-вом аргументов?

    shabelski89
    @shabelski89
    engineer
    Потому что Sqlite принимает кортеж:
    cursor.execute('INSERT INTO ids (name, surname, patronymic, class) VALUES (?, ?, ?, ?);', (NAME, SURNAME, PATRONYMIC, CLASS))
    Ответ написан
    Комментировать