[Python] SQLmodel & postgres could not locate a bind configured mapper for the session

Discussão em 'Python' iniciado por Stack, Abril 29, 2025.

  1. Stack

    Stack Membro Participativo

    I am using SQL model to create my tables and use as an ORM. I can create the tables fine but if I try any operation I get a sqlalchemy.exc.UnboundExecutionError: Could not locate a bind configured on mapper Mapper[User(user)], SQL expression or this Session. I have used SQLmodel with postgres before and never run in to this. Here is the code:

    from contextlib import contextmanager
    from logging import getLogger
    from typing import Annotated, Generator

    from fastapi import Depends, HTTPException
    from opentelemetry import trace
    from sqlalchemy.exc import SQLAlchemyError
    from sqlalchemy.orm import sessionmaker
    from sqlmodel import SQLModel, Session as SQLModelSession, create_engine

    from app.config import settings
    # from telemetry import TracingContextManager
    from app.auth.models import User
    from app.orders.models import Order

    logger = getLogger(__name__)
    tracer = trace.get_tracer(__name__)

    # Create engine with connection pooling for better performance under load
    engine = create_engine(
    settings.DATABASE_URL,
    echo=settings.DB_ECHO, # Only enable echo in development
    pool_pre_ping=True, # Check connection validity before using it
    pool_recycle=3600, # Recycle connections after 1 hour
    pool_size=10, # Maximum number of connections in the pool
    max_overflow=20, # Maximum number of connections that can be created beyond pool_size
    )

    SessionLocal = None


    def create_db_and_models() -> None:
    """Create database tables if they don't exist."""

    try:
    SQLModel.metadata.create_all(engine)
    logger.info("Database tables created successfully")
    except Exception as e:
    logger.error(f"Error creating database tables: {e}")
    raise


    def get_session_local():
    """Get a new database session."""
    global SessionLocal
    if SessionLocal is None:
    logger.info("Database session begun.")
    SessionLocal = sessionmaker(class_=SQLModelSession, autoflush=False, bind=engine)
    return SessionLocal


    def get_session():
    """Dependency for FastAPI routes that need a database session."""
    db = get_session_local()()
    try:
    yield db
    logger.debug("Database session committed")
    except SQLAlchemyError as e:
    logger.error(f"Database error in request: {e}")
    db.rollback()
    raise HTTPException(status_code=500, detail="Database error")
    except Exception as e:
    logger.error(f"Unexpected error in database session: {e}")
    db.rollback()
    raise
    finally:
    logger.debug("Closing database session")
    db.close()


    # Dependency for FastAPI routes
    DbSession = Annotated[SQLModelSession, Depends(get_session)]


    if __name__ == "__main__":
    create_db_and_models()


    [Edit: I have tried using with Session(engine) as db too.

    Continue reading...

Compartilhe esta Página