除了调用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_start
和after_server_stop
侦听器tortoise.contrib.sanic.register_tortoise
的建议。
我想对此补充一个警告。如果您在 ASGI 模式下使用 Sanic,那么您确实应该使用其他侦听器: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):
...
是的,您可以使用register_tortoise
tortoise.contrib.sanic
它注册before_server_start
和after_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}"