Создается пустая БД в sqlite3
Ничего не трогал, сначала просто перестала читаться бд. Пофиксил проблему, теперь просто создается пустая БД без таблицы 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 шт):
Как по мне - легче и удобнее использовать 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()