Создается пустая БД в sqlite3

В sqliteviewer выглядит моя БД вот так. Хотя в ней должна быть tables(1) usersНичего не трогал, сначала просто перестала читаться бд. Пофиксил проблему, теперь просто создается пустая БД без таблицы users. Сам код я не трогал, буквально 15 минут назад всё работало. Может быть где-то забыл ' проставить

Абсолютный путь также не работает и создается все равно пустая БД

import sqlite3 as sq
    
db = sq.connect("tg.db")
cur = db.cursor()
    
async def db_start():
    cur.execute("""
    CREATE TABLE IF NOT EXISTS users(
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        tg_id INTEGER,
        uid INTEGER
    )
    """)
    db.commit()

Ошибка sqlite3.OperationalError: no such table: users

При попытке найти БД, которая используется, всё в порядке. Выводится путь к моей БД. Также она везде обрабатывается, но не может обработаться, т.к. пустая.

from pathlib import Path
import sqlite3 as sq
    
db_fn = Path("tg.db")
db = sq.connect(db_fn)
cur = db.cursor()
    
if not (db_fn.exists() and db_fn.stat().st_size > 0):
    raise FileNotFoundError(f"file [{db_fn.resolve()}] is empty or doesn't exist!")
cur = db.cursor()
cur.execute("SELECT * FROM users")

Код

@router.message(Command('character'),
                 StateFilter(None)
)
async def enkanet(message: Message, state: FSMContext):
    await state.set_state(Reg.name)
    await message.answer('Напиши свой UID')
    print("card request")
    
 
@router.message(
        StateFilter(Reg.name)
)
async def character_card(message: Message,
                           state: FSMContext,
                           ) -> None:  
    await state.update_data(name=message.text)
    data = await state.get_data()    
    uid = data["name"]
    tgid = message.from_user.id
    try:
        await tg.add(id=uid, tgid=tgid)            
        await state.clear()
        await message.bot.send_chat_action(
        chat_id=message.chat.id,
        action=ChatAction.TYPING
        )
        await message.answer(
        "ЖДИ\n\n\nСекунд 20"
        )
        style_1 = cur.execute("SELECT style FROM users WHERE tg_id = ?", (tgid,)).fetchone()[0]
        card1 = await card_generate(uid=uid, style=style_1)
        if card1[0] == 1:
            await message.answer(card1[1])
        elif card1[0] == 2:
            await message.answer(card1[1])
        else:
            await message.answer(card1[0], reply_markup=card1[1])
    except OperationalError:
        await state.clear()
        return message.reply(
            'Выход\nНапиши свой UID ЦИФРАМИ\n/character'
            )

Код2

import sqlite3 as sq


db = sq.connect('tg.db')
cur = db.cursor()

async def db_start():
    cur.execute("""
    CREATE TABLE IF NOT EXISTS users(
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        tg_id INTEGER,
        uid INTEGER,
        style INTEGER
    )
    """)
    db.commit()

async def add(id, tgid):
    info = cur.execute('SELECT * FROM users WHERE tg_id=?',(tgid, )).fetchone()
    if info is None: 
        cur.execute(f"INSERT INTO users (uid, tg_id) VALUES (({id}), ({tgid}))")
        db.commit() 
    else:
        sqlite_update_query = f"""UPDATE users SET uid = {id} WHERE tg_id = {tgid}"""
        cur.execute(sqlite_update_query)
        db.commit()
        if sq.OperationalError:
            return
        return

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

Автор решения: Funsy

Как по мне - легче и удобнее использовать class для управлением бд-шкой.

import sqlite3


class Database:

    def __init__(self, db_file_name='tg.db'):
        self.connection = sqlite3.connect(db_name, check_same_thread=False)
        self.connection.row_factory = sqlite3.Row # Посоветовал бы создать Row для более удобного извлечения данных (в виде dict)
        self.cursor = self.connection.cursor()

        self.cursor.execute('''CREATE TABLE IF NOT EXISTS users (
                            id INTEGER PRIMARY KEY AUTOINCREMENT,
                            tg_id INTEGER,
                            uid INTEGER
                            )''')

Увидел в комментариях БД создалась пустая - а какая должна создаться? Пока вы в неё что-то не добавите - она будет пустая... Вот тебе пример как добавлять элементы в БД-шку

import sqlite3


class Database:

    def __init__(self, db_file_name='tg.db'):
        self.connection = sqlite3.connect(db_name, check_same_thread=False)
        self.connection.row_factory = sqlite3.Row
        self.cursor = self.connection.cursor()

        self.cursor.execute('''CREATE TABLE IF NOT EXISTS users (
                            id INTEGER PRIMARY KEY AUTOINCREMENT,
                            tg_id INTEGER,
                            uid INTEGER
                            )''')
    def add_component(self, tg_id, uid):
        self.cursor.execute('''INSERT INTO users (tg_id, uid) VALUES (?, ?, ?)''', (tg_id, uid))
        self.connection.commit()

→ Ссылка