mongkok/fastapi-debug-toolbar

sqlalchemy use problem

65tech opened this issue · 4 comments

show "No SQL queries were recorded during this request."

Also having this issue! Haven't look into it further. But no queries are shown

Same here

In my case, I found that this is because fastapi-debug-toolbar expects a db: Session = Depends(...) annotation on the route, as hinted in the README:

Please make sure to use the "Dependency Injection" system as described in the FastAPI docs

But a/ I don't use this style, as I use a different DI system than FastAPI's (I use punq), and b/ I use SQLAlchemy async support, so the session would be an AsyncSession anyway -- yet the code explicitly checks for Session subclass on the dependency.

To get things working, I had to subclass the default panel and override how the engine is registered for SQLAlchemy events, passing the project's SQLAlchemy engine myself:

from debug_toolbar.panels.sqlalchemy import SQLAlchemyPanel as Base
from fastapi import Request, Response

from server.config.di import resolve
from server.infrastructure.database import Database


class SQLAlchemyPanel(Base):
    async def process_request(self, request: Request) -> Response:
        db = resolve(Database)
        engine = db.engine.sync_engine

        self.register(engine)
        try:
            return await super().process_request(request)
        finally:
            self.unregister(engine)

(My actual implementation also includes the JSON dump fix from #15.)

Then use this by passing its Python module path to panels=....

Then I am able to see queries in the SQLAlchemy section of debug toolbar.

Hope this helps!

Hey @65tech ,
A new release was created related with this, see v0.3.0.

If you are using FastAPI dependencies add SQLAlchemyPanel to the panel list, the panel supports now fastapi>=0.74.0.
If you don't use dependencies then create a new class that inherits from SQLAlchemyPanel, override the add_engines method and add the class path to your panel list, see #21:

from debug_toolbar.panels.sqlalchemy import SQLAlchemyPanel as BasePanel
from sqlalchemy import create_engine

engine = create_engine("sqlite://...", connect_args={"check_same_thread": False})


class SQLAlchemyPanel(BasePanel):
    async def add_engines(self, request: Request):
        self.engines.add(engine)

Thanks @florimondmanca for your help on this.