Простой бот на aiogram and tortoise orm

За основу мы возьмем 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())