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)