SQLite: асинхронная запись в БД (2 варианта / как лучше?)
Пишу бота на aiogram + sqlite. Точнее, бот написан и работает, а я думаю об улучшениях.
Есть вопрос по БД, как более верно работать с SQLite, чтобы это было надёжно, быстро, асинхронно. И вообще принимаю замечания по оптимизации кода. Я новичок.
- На данный момент у меня работа с БД сделана с помощью класса:
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)
- Есть другой вариант. Более асинхронный, как я это понимаю. С помощью 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?
Благодарю за любую обратную связь.