如何在 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_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}"
这里是 Sanic 维护者。
另一个答案提供了使用 tortoise.contrib.sanic.register_tortoise
的建议,它使用 before_server_start
和 after_server_stop
听众。
我想补充一点。如果您在 ASGI 模式下使用 Sanic,那么您真的应该使用其他侦听器:after_server_start
和 before_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):
...
除了调用 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_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}"
这里是 Sanic 维护者。
另一个答案提供了使用 tortoise.contrib.sanic.register_tortoise
的建议,它使用 before_server_start
和 after_server_stop
听众。
我想补充一点。如果您在 ASGI 模式下使用 Sanic,那么您真的应该使用其他侦听器:after_server_start
和 before_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):
...