Как мне правильно сделать таблицы в sqlitestudio для username, attempts, range и записать их в питон? telebot, sqlite3

Я делал бота на угадывание числа, и все работает, но у меня есть функция изменить диапазон генерации числа и изменить кол-во попыток, и если два человека играют, а один из них поменял попытки или диапазон, то он изменится у всех.

Это мой код сохранения в словарь, это была такая интегрированная база данных.

storage = dict()

def init_storage(user_id):
    storage[user_id] = dict(attemps=None, random_num=None)

def set_init_storage(user_id, key,value):
    storage[user_id][key] = value

def get_init_storage(user_id):
    return storage[user_id]

Вот так у меня записывались в эту интегрированную базу данных значения:

    set_init_storage(message.chat.id, 'a', default_a)
    set_init_storage(message.chat.id, 'b', default_b)

А выводились с помощью:

get_init_storage(message.chat.id) # Получает все значения сразу
get_init_storage(message.chat.id)['attempts'] # Получает одно значение, если ввести его название в квадратные скобы

P.S Как правильно создать таблицу, я имел ввиду какие галочки ставить. Вот здесь много всяких галочек, настройки для них мне надо такую настройку для attempts, range, username.

Использую модуль telebot и sqlite3, версия python - 3.12


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

Автор решения: Oopss
import sqlite3


def init_storage():
    # Здесь можно сделать через try except
    con = sqlite3.connect('dbusers.db')
    cur = con.cursor()
    cur.execute(''' CREATE TABLE IF NOT EXISTS users (
                    id INTEGER PRIMARY KEY,
                    username TEXT NOT NULL,
                    attempts INTEGER,
                    range TEXT NOT NULL
                   )  ''')
    con.commit()
    con.close()
    return 0


def set_init_storage(username, attempts, range):
    # Здесь можно сделать через try except
    # Функция для загрузки по одному, если загрузка массовая не следует каждый раз откр и закр базу
    con = sqlite3.connect('dbusers.db')
    cur = con.cursor()
    cur.execute(''' INSERT INTO users (username, attempts,range) 
        VALUES (?,?,?) ''', (username, attempts, range))
    con.commit()
    con.close()
    return 0


def get_init_storage(username):
    # Здесь можно сделать через try except
    # Функция для загрузки по одному, если выборка массовая не следует каждый раз откр и закр базу
    # нужно переделать запрос
    con = sqlite3.connect('dbusers.db')
    cur = con.cursor()
    res = cur.execute(''' SELECT id,username,attempts,range FROM users WHERE username=? ''', (username,)).fetchone()
    con.close()
    return res

def get_init_storage_all_users():
    
    con = sqlite3.connect('dbusers.db')
    cur = con.cursor()
    res = cur.execute(''' SELECT id,username,attempts,range FROM users ''').fetchall()
    con.close()
    return res


def main():
    init_storage()
    for i in [1, 2, 3]:
        username, attempts, range = input(' Напишите через пробел username, attempts, range  ').split()
        set_init_storage(username, attempts, range)

    for u in get_init_storage_all_users():
        print(u)

    username=input('Введите имя пользователя ')
    print(get_init_storage(username))

if __name__=='__main__':
    main()

После выполнения программы, можно зайти в sqlitestudio и посмотреть таблицы и данные в базе dbusers.db

→ Ссылка