Sanic and Tortoise Orm and sqlite

Tortoise ORM был создан с учетом отношений и восхищения превосходным и популярным Django ORM. В его дизайне заложено, что вы работаете не только с таблицами, вы работаете с реляционными данными.

Для знакомства с ORM tortiose documention, примеры
А проще всего скачайте с gitverse sanic_start
Создадим папку models. В ней создадим файл model.py,
содержание файла model.py

pip install -U tortoise-orm

from tortoise import fields, Model
import json



# Поле JSON.
#
# В этом поле можно хранить словари или списки любой структуры, совместимой с JSON.
#
# Вы можете указать свой собственный кодировщик/декодер JSON, оставив значение по умолчанию, это должно работать хорошо. Если вы #установили orjson, мы по умолчанию используем его, в противном случае json будет использоваться модуль по умолчанию.
#
# encoder:
# Пользовательский кодировщик JSON.
#
# decoder:
# Пользовательский декодер JSON.



def encodind_dict(args: dict):
    return json.dumps(args)


def decode_dict(args: str):
    return json.loads(args)


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(encode=encodind_dict, decode=decode_dict)


class AbstractBaseModel(Model):
    id = fields.IntField(pk=True)

    class Meta:
        abstract = True


class User(AbstractBaseModel, TimestampMixin, JsonMixin):
      name = fields.CharField(unique=True, max_length=155)


      class Meta:
          table = "user"


      def __str__(self):
          return str(self.name)

      @property
      def data_name_json(self):
         return f"id = {self.pk}, name = {self.name},  data = {self.data}"

Создадим в папке models, файл create_user.py.
Cодержание файла create_user.py.

from sanic import Sanic
from tortoise.exceptions import DoesNotExist, IntegrityError
from models.model import User
from sanic.log import logger


"""
Заполним данными модел User, при запуске сервера Sanic подключим слушателя "before_server_start"
Sanic предоставляет вам восемь (8) возможностей для внедрения операции в жизненный цикл вашего сервера приложений. Это не включает сигналы , которые позволяют дальнейшую настройку внедрения.
https://sanic.dev/en/guide/basics/listeners.html#listeners
"""


def create_initial_user(app: Sanic) -> None:

    @app.listener("before_server_start")
    async def generate(app, loop):
        lst_dict = {"Petra": {"data": "данные"}, "Maik": {"data": "данные"}}
        try:
            for key, val in lst_dict.items():
                await User.create(name=key, data=val)
        except IntegrityError as e:
            logger.info(f"Initial user init db created. {repr(e)}")

Содержание файла app.py.

from sanic import Sanic
from sanic.response import json
from sanic_ext import Extend, render
from tortoise.contrib.sanic import register_tortoise
from models.model import User
from models.init_db import create_initial_user


@app.route("/user")
async def list_all(request):
    users = await Users.all()
    return response.json({"users": [str(user.data_name_json) for user in users]})



@app.route("/user/<pk:int>")
async def get_user(request, pk):
    user = await Users.query(pk=pk)
    return response.json({"user": str(user)})



register_tortoise(app, db_url="sqlite://example.db", modules={"models": ["models.models"]}, generate_schemas=True)
create_initial_user(app)


if __name__ == '__main__':
   app.run(host='127.0.0.1', port=8000, workers=1, auto_reload=True, debug=True)