• Как записать данные в БД и позже получить их в боте?

    half-life
    @half-life
    Ну давай попробуем. Опустим бизнес-логику получения данных о пользователе, это всё таки зависит от реализации твоего бота. Пойдём с того момента что у тебя уже есть эти данные и тебе их нужно сохранить.

    Смотри первое что тебе нужно сделать - это проверить существует ли нужная тебе таблица в базе.
    Если нет то создать её.
    Создаёшь модуль допустим db
    В нём создаёшь файл допустим utils.py c таким содержимым:
    utils.py
    from sqlite3 import Connection as SqliteConnection
    from sqlite3 import Cursor as SqliteCursor
    
    sql = """
    pragma foreign_keys = on;
    create table if not exists users
    (
      id          integer primary key autoincrement,
      internal_id text not null,
      first_name  text not null,
      last_name   text not null,
      username    text not null unique,
      created     date not null default current_date
    );
    create unique index if not exists users_id_uindex
      on users (id);
    create unique index if not exists users_internal_id_uindex
      on users (internal_id);
    create index if not exists users_first_name_index
      on users (created);
    create index if not exists users_last_name_index
      on users (created);
    create unique index if not exists users_username_uindex
      on users (username);
    create index if not exists users_created_index
      on users (created);
    """
    
    
    def check_db(db_connect: SqliteConnection,
                 db_cursor: SqliteCursor) -> None:
        db_cursor.executescript(sql)
        db_connect.commit()


    Создаешь ещё один файл в модуле db c именем queries.py
    В нём для удобства описываешь запросы к базе.
    Тебе нужно 2 запроса:
    1) На сохранение данным
    2 На получение данных
    Делаем:
    queries.py
    from sqlite3 import Connection as SqliteConnection
    from sqlite3 import Cursor as SqliteCursor
    from typing import List
    
    def insert_user(db_cursor: SqliteCursor,
                    db_connect: SqliteConnection,
                    internal_id: str, username: str,
                    first_name: str, last_name: str) -> None:
        db_cursor.execute("""
                insert into users(internal_id, username, first_name, last_name)
                select :internal_id, :username, :first_name, :last_name
                where not exists(select 1 from users where internal_id = :internal_id and username = :username)
            """, {
            'internal_id': internal_id,
            'username': username,
            'first_name': first_name,
            'last_name': last_name,
        })
        db_connect.commit()
    
    def select_user(db_connect: SqliteConnection,
                    username: str) -> List[tuple] or None:
        result = db_connect.execute(
            f"""select *
                from users
                where username = :username""",
            {'username': username},
        ).fetchone()
    
        return result


    Дальше в том месте, где тебе нужно сохранить данные делаешь что-то такое:
    somewhere _in_your_code
    from contextlib import closing
    import sqlite3
    
    from db.utils import check_db
    from db.queries import insert_user
    
    with closing(sqlite3.connect('db_name')) as db_connect:
            with closing(db_connect.cursor()) as db_cursor:
                check_db(db_connect, db_cursor)  # проверяем есть ли таблица в базе, если нет то создаём её
                insert_user(db_cursor, db_connect, 'internal_id', 'username', 'first_name', 'last_name')  # если в базе ещё нет такого юзера с internal_id и username то он создастся


    А в том месте, где тебе нужно получить данные что-то такое:
    somewhere _in_your_code
    from contextlib import closing
    import sqlite3
    
    from db.utils import check_db
    from db.queries import select_user
    
    
    with closing(sqlite3.connect('db_name')) as db_connect:
            with closing(db_connect.cursor()) as db_cursor:
                check_db(db_connect, db_cursor)  # проверяем есть ли таблица в базе, если нет то создаём её
                user = select_user(db_connect, 'username')



    Вот вроде и всё.
    Пы.Сы. Код писался в текстовом редакторе, возможно что-то проебал.
    Да и пользуйся докой, не стесняйся
    Ответ написан
    1 комментарий
  • Как в telebot (pyTelegramBotAPI) обрабатывать разными функциями одни и те же текстовые сообщения?

    vera_ira
    @vera_ira
    Делаю приложение по изучению Иврит (Python Kotlin)
    Думаю, легче воспользоваться модулем fsm_telebot.storage
    $ pip install -U FSMTelegramBotAPI

    import fsm_telebot
    from fsm_telebot.storage.memory import MemoryStorage
    storage = MemoryStorage()

    В процессе бот задаем нужный параметр. Например так:
    bot.set_state('level_1', message.chat.id)
    И вызываем хендлер:
    @bot.message_handler(state='level_1')
    Очень подробно описано тут:
    https://github.com/Ars2014/FSMTelegramBotAPI
    Ответ написан
    Комментировать