如何在 sanic 应用程序中为 tortoise-orm 初始化数据库?

How to init db for tortoise-orm in sanic app?

除了调用 Tortoise.init 之外,还有其他方法可以从我的 Sanic 应用程序在 tortoise-orm 中注册数据库吗?

from tortoise import Tortoise

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

是的,您可以使用 tortoise.contrib.sanic

提供的 register_tortoise

它注册了 before_server_startafter_server_stop 挂钩以在 Sanic 网络服务器中设置和拆除 Tortoise-ORM。从 tortoise orm 查看这个 sanic 集成 example

你可以像这样使用它,

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}"

这里是 Sanic 维护者。

另一个答案提供了使用 tortoise.contrib.sanic.register_tortoise 的建议,它使用 before_server_startafter_server_stop 听众。

我想补充一点。如果您在 ASGI 模式下使用 Sanic,那么您真的应该使用其他侦听器:after_server_startbefore_server_stop.

这是因为当服务器在 Sanic 之外时,实际上并没有 "before" 服务器启动或 "after" 服务器停止。因此,如果您在 ASGI 模式下实施 tortoise 所采用的建议解决方案,则每次启动服务器时您都会在日志中收到警告。它仍然受支持,但可能会很烦人。

在这种情况下:

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

@app.listener('before_server_stop')
async def close_db(app, loop):
    ...