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



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

这里的Sanic维护者。

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

我想对此补充一个警告。如果您在 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):
...

是的,您可以使用register_tortoisetortoise.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)

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

相关内容

  • 没有找到相关文章

最新更新