fastapi-utils icon indicating copy to clipboard operation
fastapi-utils copied to clipboard

[BUG] Cannot use get_db as a dependency with repeated task

Open rafaluk opened this issue 3 years ago • 4 comments

While using fastapi-utils scheduler, passing Depends(get_db) as a parameter to the function doesn't work.

This is how it works within FastAPI endpoint:

@app.post("/sample_test")
async def sample_test(db: Session = Depends(get_db)):
    return db.query(models.User.height).all()

This is how it doesn't work with FastAPI utils:

@app.on_event("startup")
@repeat_every(seconds=10)
async def sample_test(db: Session = Depends(get_db)):
    return db.query(models.User.height).all()

(note that the functions are the same, only decorators have changed)

There is no error, but the query is not being called (I think the session is not created?). It just gets stuck.

The get_db() function differs a little bit between those two, but under the hood it does the same for both.

Environment:

  • OS: Windows 10
  • Python 3.9.5 with:
    • FastAPI Utils 0.2.1
    • FastAPI 0.63.0
    • SQLAlchemy 1.4.22
  • SQL Server v.18.8

rafaluk avatar Aug 05 '21 07:08 rafaluk

Yup. I face the same issue here

tintinthong avatar Apr 26 '22 08:04 tintinthong

I am also facing the same issue, any solution?

shakthifuture avatar Jun 29 '22 13:06 shakthifuture

The reason it doesn't work in repeat_task is because Depends can't be used in our own functions. It has to be in FastAPI function. Refer to this: https://github.com/tiangolo/fastapi/issues/1693#issuecomment-665833384

However, I also trying to access Session from a repeated_task function and is unable. Did anyone found any workaround?

hussainsajib avatar Aug 10 '22 17:08 hussainsajib

well, you can always get your objects without the dependency injection mechanism... Not great for testing though

from app.db import SessionLocal
....
@app.on_event("startup")
@repeat_every(seconds=60)
async def do_something() -> None:
    db = SessionLocal()
   ....

julienV avatar Aug 13 '22 21:08 julienV