За основу мы возьмем aiogram - современный и полностью асинхронный фреймворк. Использование базы данных позволяет ботам быстро и эффективно обрабатывать запросы пользователей, предоставлять персонализированный контент и услуги, а также сохранять историю взаимодействия с каждым пользователем. Это особенно важно для больших приложений, где требуется обработка большого объема данных. Мы будем использовать Tortoise-Orm async/await (SQLite3), легко и просто.
Cоздадим папку mkdir aiogram_and_tortoise и перейдем в эту папку cd aiogram_and_tortoise/.
mkdir aiogram_and_tortoise
cd aiogram_and_tortoise
Cоздадим виртуальное окружение и активируем.
python3 -m venv venv && source ./venv/bin/activate
Скачаем aiogram and tortoise-orm.
pip install aiogram
pip install -U tortoise-orm
Создадим папку mkdir models в ней создадим файл model.py
mkdir models
cd models
vim model.py
Сoдержание файла model.py
from tortoise.models import Model
from tortoise import fields
class TimestampMixin():
created_at = fields.DatetimeField(null=True, auto_now_add=True)
modified_at = fields.DatetimeField(null=True, auto_now=True)
class JsonMixin():
data = fields.JSONField()
class AbstractBaseModel(Model):
id = fields.IntField(pk=True)
class Meta:
abstract = True
class Guest(AbstractBaseModel, TimestampMixin, JsonMixin):
name = fields.CharField(unique=True, max_length=255)
class Meta:
table = "guest"
def __str__(self):
return str(self.name)
@property
def json(self):
self.data["cteate_time"] = self.created_at
self.data["update_time"] = self.modified_at
return self.data
В наше папке aiogram_and_tortoise, создадим файл bot.py
touch bot.py
Сoдержание файла bot.py .
import asyncio
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.filters.command import Command
from aiogram.types import BotCommand
from tortoise import Tortoise
from models.model import Guest
logging.basicConfig(level=logging.INFO)
bot = Bot(token="657222:token")#invalid - недействительный
dp = Dispatcher()
async def init_db():
await Tortoise.init(
db_url='sqlite://bot.sqlite3',
modules={'models': ['models.model']}
)
await Tortoise.generate_schemas()
@dp.message(Command("start"))
async def cmd_start(message: types.Message):
data = dict(message.from_user)
guest = None
try:
guest = await Guest.create(name="test", data=data)
except Exception as e:
guest = await Guest.filter(name="test").first()
guest.data = data
await guest.update_data()
await message.answer("бот запушен производит запись в базу данных")
@dp.message(Command("info"))
async def cmd_guest(message: types.Message):
guest = await Guest.filter(name="test").first()
await message.answer(f"База данных = {guest.json}")
async def set_menu(bot: Bot):
menu_commands = [
BotCommand(command='/start', description='Запустить'),
BotCommand(command='/info', description='Информация, данные'),]
await bot.set_my_commands(menu_commands)
dp.startup.register(set_menu)
async def main():
await init_db()
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())