1

除了调用之外,有没有办法从我的 Sanic 应用程序中在tortoise-ormTortoise.init中注册数据库?

from tortoise import Tortoise

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

2 回答 2

3

Sanic 维护者在这里。

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

我想对此添加一个警告。如果您在 ASGI 模式下使用 Sanic,那么您确实应该使用其他侦听器:after_server_startbefore_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):
    ...
于 2020-05-14T10:53:21.167 回答
1

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

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

你可以像这样使用它,

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)

模型.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}"
于 2020-05-13T21:37:58.403 回答