@popoff03

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

Привет. Я учусь работать с БД. Выбрал sqlite3. Нужно получить данные о пользователе (фамилия, имя, id, username) , записать их в базу, а после нажатия им на кнопку выдать ему сообщением. Подскажите как это реализовать. Спасибо.
  • Вопрос задан
  • 97 просмотров
Пригласить эксперта
Ответы на вопрос 2
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')



Вот вроде и всё.
Пы.Сы. Код писался в текстовом редакторе, возможно что-то проебал.
Да и пользуйся докой, не стесняйся
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы