Как инициализировать базу данных для tortoise-orm в приложении sanic?

Есть ли способ зарегистрировать базы данных в tortoise-orm из моего Sanic приложение, кроме звонка Tortoise.init?

from tortoise import Tortoise

await Tortoise.init(
        db_url='sqlite://db.sqlite3',
        modules={'models': ['app.models']}
    )
    # Generate the schema
    await Tortoise.generate_schemas()

person void    schedule 13.05.2020    source источник


Ответы (2)


Сопровождающий Sanic здесь.

Другой ответ предлагает использовать tortoise.contrib.sanic.register_tortoise, который использует before_server_start и after_server_stop слушателей.

Я хочу добавить к этому предостережение. Если вы используете Sanic в режиме ASGI, вам действительно следует использовать другие слушатели: after_server_start и before_server_stop.

Это потому, что на самом деле не существует сервера «до» запуска или «после» остановки сервера, когда сервер находится за пределами Sanic. Следовательно, если вы реализуете предложенное решение, принятое tortoise в режиме ASGI, вы будете получать предупреждения в журналах каждый раз, когда запускаете сервер. Он по-прежнему поддерживается, но может раздражать.

В таком случае:

@app.listener('after_server_start')
async def setup_db(app, loop):
    ...

@app.listener('before_server_stop')
async def close_db(app, loop):
    ...
person The Brewmaster    schedule 14.05.2020
comment
спасибо за это, при запуске через gunicorn sanic worker использование register_tortoise правильно? - person void; 14.05.2020
comment
да. Рабочий-пулемет - это подкласс самого пулеметчика. Так что все должно быть хорошо. - person The Brewmaster; 14.05.2020

Да, вы можете использовать register_tortoise из tortoise.contrib.sanic

Он регистрирует before_server_start и after_server_stop хуки для установки и отключения Tortoise-ORM на веб-сервере Sanic. Посмотрите этот разумный пример из tortoise orm.

вы можете использовать это как,

from sanic import Sanic, response

from models import Users
from tortoise.contrib.sanic import register_tortoise

app = Sanic(__name__)


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

register_tortoise(
    app, db_url="sqlite://:memory:", modules={"models": ["models"]}, generate_schemas=True
)

if __name__ == "__main__":
    app.run(port=5000)

models.py

from tortoise import Model, fields


class Users(Model):
    id = fields.IntField(pk=True)
    name = fields.CharField(50)

    def __str__(self):
        return f"User {self.id}: {self.name}"
person void    schedule 13.05.2020