Задать вопрос
@Lmn14

Почему Python не видит таблицы sqlite?

Писал бота на аиограм и столкнулся с проблемой. Создавая базу данных в sqlite(вручную) создаю таблицу, визуально видно, как она создается, но на самом деле ее не существует. Задавал подобный вопрос в другом чате, никто мне не смог внятно ответить, посоветовали изучить основы sqlite. Перечитал, ничего дельного для себя не выделил. Я несколько раз перепроверял код, вечно одна и та же ошибка. Таблицу так же пытался пересоздавать, менять название, удалял базу данных полностью. Решил повторить на втором проекте - та же проблема. 64881a0910437739832403.jpeg
К слову я проверял через sqlitebrowser, таблицы дейсвтительно нет, но если зайти через обычное приложение sqlite, то мог им спокойно пользоваться.64881a558ffe2998296333.png

from aiogram import Bot, Dispatcher, executor, types
from aiogram.types import ReplyKeyboardMarkup, ReplyKeyboardRemove
from dotenv import load_dotenv 
from markups import helps, wlist
from aiogram.dispatcher.filters import Command
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from datab import Database
import os
import logging

load_dotenv()
logging.basicConfig(level=logging.INFO)
bot = Bot(os.getenv('TOKEN')) 
storage = MemoryStorage()
db = Database('shopusers.db')
dp = Dispatcher(bot=bot)

@dp.message_handler(commands=['start', 'help'])
async def start_cmd(message: types.Message):
    if(not db.user_exists(message.from_user.id)):
        db.add_user(message.from_user.id)
        await bot.send_message(message.from_user.id, f'{message.from_user.first_name}, C возвращением', reply_markup=helps)
    else:
        await bot.send_message(message.from_user.id, f'{message.from_user.first_name}, Добро пожаловать', reply_markup=helps)

Это код файла main, я хочу добавить проверку во время ввода команды /start, которая определяет, есть ли пользователь уже в базе или его не существует.
Это файл datab.py:
import sqlite3

class Database:
    def __init__(self, db_file):
        self.connection = sqlite3.connect(db_file)
        self.cursor = self.connection.cursor()

    def add_user(self, id):
        with self.connection:
            self.cursor.execute("INSERT INTO `Users` (`id`) VALUES (?)", (id,))
            return self.cursor.execute

    def user_exists(self, id):
        with self.connection:
            result = self.cursor.execute("SELECT * FROM `Users` WHERE  `id` = ?", (id,)).fetchall()
            return bool(len(result))


sql код базы данных:
CREATE TABLE Users ( 
    id       INTEGER   PRIMARY KEY 
                       NOT NULL, 
    user_id  INTEGER   NOT NULL, 
    nickname TEXT (60), 
    time_sub           NOT NULL 
                       DEFAULT (0), 
    signup   TEXT      DEFAULT setnickname 
);


Писал по подобию видеоурока, в первый раз всё вышло.
  • Вопрос задан
  • 414 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
SoreMix
@SoreMix
yellow
Значит и правда нет такой таблицы. Сделайте её создание в __init__ и всё

import sqlite3

class Database:
    def __init__(self, db_file):
        self.connection = sqlite3.connect(db_file)
        self.cursor = self.connection.cursor()

        with self.connection:
            self.cursor.execute('''
               CREATE TABLE IF NOT EXISTS Users ( 
                    id INTEGER PRIMARY KEY NOT NULL, 
                    user_id INTEGER NOT NULL, 
                    nickname TEXT (60), 
                    time_sub NOT NULL DEFAULT (0), 
                    signup TEXT DEFAULT setnickname 
                );
            ''')

    def add_user(self, id):
        with self.connection:
            self.cursor.execute("INSERT INTO `Users` (`id`) VALUES (?)", (id,))
            return self.cursor.execute

    def user_exists(self, id):
        with self.connection:
            result = self.cursor.execute("SELECT * FROM `Users` WHERE  `id` = ?", (id,)).fetchall()
            return bool(len(result))


ps: придется пофиксить add_user т.к. он принимает только один параметр - ID, а у вас 3 NOT NULL параметра
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
idShura
@idShura
commit() забыл выполнить после создания таблицы.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы