我想优化我的 API 对数据库的调用量。但是是否可以让 Postgres 遇到唯一约束错误。例如,在注册用户时,我有两个选择:
from app.models import Users
from tortoise.exceptions import DoesNotExist
try:
await Users.get(email=email)
raise HTTPException(
status_code=HTTP_400_BAD_REQUEST, detail="User already exists"
)
except DoesNotExist:
user = await Users.create(email, hashed_pw)
这将对数据库进行两次调用,但在 Python 中会发生异常。请注意,在 postgres 结束时不会引发任何错误或异常。Postgres 只返回 nill,它在 python 端被解释为 DoesNotExist。另一种解决方案是:
from app.model import Users
from asyncpg.exceptions import UniqueViolationError
try:
user = await Users.create(email, hashed_pw)
except UniqueViolationError:
raise HTTPException(
status_code=HTTP_400_BAD_REQUEST, detail="User already exists"
)
这只会进行一次数据库调用,但是在 postgres 数据库中会发生错误。显然,在我看来,第二个实现会更有效,但是在 postgres 端创建一个异常可以吗?