【问题标题】:How to init db for tortoise-orm in sanic app?如何在 sanic 应用程序中为 tortoise-orm 初始化 db?
【发布时间】:2020-08-30 06:38:50
【问题描述】:

除了调用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()

【问题讨论】:

    标签: python-3.7 sanic tortoise-orm


    【解决方案1】:

    这里是 Sanic 维护者。

    另一个答案提供了使用tortoise.contrib.sanic.register_tortoise 的建议,即使用before_server_start 和after_server_stop 侦听器。

    我想对此添加一个警告。如果您在 ASGI 模式下使用 Sanic,那么您确实应该使用其他侦听器:after_server_start 和 before_server_stop。

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

    在这种情况下:

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

    【讨论】:

    • 谢谢,通过 gunicorn sanic worker 运行时,register_tortoise 的使用是否正确?
    • 是的。 gunicorn worker 是 gunicorn 本身的一个子类。所以,应该没问题。
    【解决方案2】:

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

    它注册before_server_start 和after_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}"
    

    【讨论】:

      猜你喜欢
      • 2021-05-03
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多