graphql-python / graphql-python/graphene-sqlalchemy

Does graphene_sqlalchemy keep sessions open?

未關閉
#292 6 則留言 3 個 reaction 已指派 0 人 在 GitHub 檢視
主要語言
Python
星號
985
分支
223
PR 合併指標
30 天內沒有已合併 PR

描述

## tl;dr

Does `graphene_sqlalchemy` keep sessions open? I'm having the problem that Postgres doesnt run `drop_all()` in my test suite.

## Explanation

Hi, I have a fastAPI app and I'm using `graphene_sqlalchemy` to generate an API from database models defined on the declarative base of SQLAlchemy. The database is _postgres_. For testing I am running some pytests against the API while it's running. So, I start a throw-away postgres container, then I start the API app, then I run `pytest`.

The tests include a `reset_testdata()` function which also uses the SQLAlchemy ORM. It looks like:
```python
def reset_testdata():
close_all_sessions() # from sqlalchemy.orm.session
models.Base.metadata.drop_all(bind=engine)
models.Base.metadata.create_all(bind=engine)

db.add_all([
# ... add stuff
])

db.commit()
db.close()
```

I noticed, that once `reset_testdata()` is used, the pytest process hangs. No errors, not able to Ctrl+C, it just waits. I had this issue before and it usually stems from Postgres not allowing stuff like `drop_all()` if there are still active sessions. After some trying out I found that queries from my app (which are implemented by `graphene_sqlalchemy`) seem to keep a session open.
(I used this example in my app: https://docs.graphene-python.org/projects/sqlalchemy/en/latest/tutorial/#defining-our-models)

I tested this, and basically I can circumvent this problem by adding a middleware that closes all sessions after every request.
```python
@app.middleware('http')
async def close_sessions(request: Request, call_next):
try:
response = await call_next(request)
finally:
close_all_sessions()
return response
```

I wonder whether I am missing something here? Any experience with this issue (if it is even an issue)?

貢獻指南

開啟貢獻指南

研究方向

首先,針對一次性 Postgres 容器,使用 reset_testdata()、close_all_sessions() 和 metadata.drop_all()/create_all() 重現 pytest 暫停問題。比較使用 graphene_sqlalchemy 的請求在有和沒有所示 FastAPI 中介軟體時的情況,然後追蹤 session 的生命週期。完成的標準是確定遺留 session 的原因,並記錄預期的清理行為或透過回歸測試涵蓋該行為。

由索引模型根據 Issue 內容生成。

評估

技術堆疊
fastapi, postgresql, python, sqlalchemy
領域
api, backend, databases, testing
Issue 類型
缺陷
難度
4/5
預估耗時
3-5 天
活躍度
停滯
描述清晰度
需要釐清
新手友好度
25/100

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。