Skip to content

Listing or returning items with UoW raises sqlalchemy.orm.exc.DetachedInstanceError #63

Description

@sevetseh28

Hi. I have a simple list endpoint as follows:

@app.get("/items/", response_model=list[schemas.Item])
async def read_items(uow: AbstractUnitOfWork = Depends(get_uow)) -> List[models.Item]:
    with uow:
        items = uow.repo.list()
    return items

items is a list of models.Item which is my domain model (dataclass). But when exiting the uow (closing the session) the items' attributes are refreshed by the ORM automatically and I get the sqlalchemy.orm.exc.DetachedInstanceError exception.

I would expect such a dataclass not to mutate since it is not an ORM model.
What would be the best approach in this case?

The same applies for the creation of an item.

Thanks!

Activity

  1. sevetseh28 commented on Mar 22, 2023

    @sevetseh28
    Author

    Maybe using schemas.Item as a DTO like this, and convert:

    def item_to_schema(item: models.Item) -> schemas.Item:
        return schemas.Item(id=item.id, title=item.title, description=item.description)
    @app.get("/items/", response_model=list[schemas.Item])
    async def read_items(uow: AbstractUnitOfWork = Depends(get_uow)) -> List[schemas.Item]:
        with uow:
            items = uow.repo.list()
            # Convert items to schemas.Item DTOs
            items_dtos = [item_to_schema(item) for item in items]
        return items_dtos

    wdyt?

  2. instanceofmel commented on Mar 6, 2024

    @instanceofmel

    A little late, but for future readers:

    You have multiple options in this case, including the one @sevetseh28 provided. Other options:

    • Return your list inside the with block
    • Set expire_on_commit=False when creating the session. This will disable the reloading of attributes after commit. I think it's safe to disable it because a handler shouldn't reload anything after commiting anyways as the aggregate must be transactionally consistent and complete before committing.
    • Use a view as described in Chapter 12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions