SQLite: асинхронная запись в БД (2 варианта / как лучше?)

Пишу бота на aiogram + sqlite. Точнее, бот написан и работает, а я думаю об улучшениях.

Есть вопрос по БД, как более верно работать с SQLite, чтобы это было надёжно, быстро, асинхронно. И вообще принимаю замечания по оптимизации кода. Я новичок.

  1. На данный момент у меня работа с БД сделана с помощью класса:
class BotDB:

    def __init__(self, db_file):
        """Инициализация"""
        self.connection = sqlite3.connect(db_file)
        self.cursor = self.connection.cursor()

# пара функций для примера:

    async def user_exists(self, user_id):
        """Есть ли такой пользователь (по id)"""
        with self.connection:
            result = self.cursor.execute("SELECT EXISTS(SELECT 1 "
                                         "FROM users "
                                         "WHERE user_id = ?)", (user_id,)).fetchone()
            return bool(result[0])

    async def user_add(self, user_id, name=None, user_status=None):
        """Добавление пользователя"""
        with self.connection:
            self.cursor.execute("INSERT INTO users(user_id, user_name, user_status) VALUES (?, ?, ?);",
                                (user_id, name, user_status,))
            return self.connection.commit()

# ... и много других.
# и в конце закрытие:

    def close(self):
        """Закрытие соединения"""
        self.connection.close()

Всё ли нормально написано и грамотно? Это рабочий вариант?

Вызываются функции так:

if not await BotDB.user_exists(message.from_user.id):
    await BotDB.user_add(message.from_user.id, message.from_user.username)
  1. Есть другой вариант. Более асинхронный, как я это понимаю. С помощью aiosqlite.

Как это в классе написать, я не понял, но можно отдельными функциями:

import aiosqlite


async def user_exists(user_id):
"""Есть ли такой пользователь (по id)"""
    async with aiosqlite.connect("db/filedb.db") as db:
        async with db.execute("SELECT EXISTS(SELECT 1 "
                              "FROM users "
                              "WHERE user_id = ?)", (user_id,)) as cursor:
            result1 = await cursor.fetchone()
            result = bool(result1[0])
        return result

И так в каждой функции. Подключаемся к файлу и т.п. И это смущает, что каждый раз мы подключаемся. Хотя может я зря переживаю и просто не понимаю как это работает.

Рабочий ли второй вариант 2? Имеет ли он преимущества перед вариантом 1?

Благодарю за любую обратную связь.


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