我有一个带有插入和更新功能的 CRUD commit
,在每个功能的末尾,如下所示:
@staticmethod
def insert(db: Session, item: Item) -> None:
db.add(item)
db.commit()
@staticmethod
def update(db: Session, item: Item) -> None:
...
db.commit()
Run Code Online (Sandbox Code Playgroud)
我有一个端点,它从 FastAPI 依赖项接收 sqlalchemy 会话,并且需要以原子方式插入和更新(数据库事务)。
处理事务时的最佳实践是什么?我无法使用 CRUD,因为它执行多个commit
.
我应该如何处理交易?你在哪里提交你的会话?在 CRUD 中?还是在每个请求的 FastAPI 依赖函数中只有一次?
我将 sqlalchemy 与 FastAPI 服务器一起使用,当我Session
从多线程函数(不是通过 http 请求)调用对象时遇到以下错误:
QueuePool limit of size 5 overflow 10 reached, connection timed out, timeout 30 (Background on this error at: http://sqlalche.me/e/13/3o7r)
Run Code Online (Sandbox Code Playgroud)
只有当我的服务器收到数百个请求并且我的线程工作人员很忙时才会发生此错误。
我读到sqlalchemy.scoped_session
可用于后台守护程序。
执行以下操作使错误消失:
Session
http请求中的常规sqlalchemy对象,FastAPI.Depends()
就像文档中推荐的那样scoped_session
- 我的服务器在需要访问数据库的不同线程中在后台运行任务,但每个线程都有自己的会话可以肯定地说,每个会话对象都得到了适当的处理(scoped_session
调用remove()
和Session
调用close()
)
我的问题是 - 当我使用单个引擎时,不建议使用这种方法吗?我应该走不同的道路吗?
谢谢!
我正在尝试将我的服务器配置为请求超时,但我找不到有关它的任何信息。我看到uvicorn
有一个名为 的属性keep_alive_timeout
,默认为 5 秒。但这似乎也不起作用。
例如:
app = FastAPI()
@app.get('/test')
def test_endpoint():
sleep(10)
Run Code Online (Sandbox Code Playgroud)
我希望请求在 5 秒后断开连接并超时,但它仍然存在并返回 200。
有人知道如何设置吗?