graphql-python / graphql-python/graphene-sqlalchemy

Does graphene_sqlalchemy keep sessions open?

Ouverte
#292 6 commentaires 3 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
Python
Étoiles
985
Forks
223
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

## 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)?

Guide de contribution

Ouvrir le guide de contribution

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.