5

I find myself occassionally in a situation where I have a table object (such as is retrieved by Metadata.tables) and want to get the Mapper object which defines a mapping from some user-defined class to a Table (and then eventually the mapped Class)

In context, I have:

  • A sqlalchemy.schema.Table object;

  • A sqlalchemy.schema.MetaData object;

  • A sqlalchemy.orm.session.Session object representing the current session.

What I want is the sqlalchemy.orm.mapper.Mapper object which defines a mapping between a user-defined class and the Table object above. I can't find a way to get this via the docs or from inspecting these objects and their available methods. Is there any way to do this?

SuperShoot
  • 9,880
  • 2
  • 38
  • 55
Coxy
  • 665
  • 5
  • 13

1 Answers1

6

SQLAlchemy-utils has a function called get_mapper:

Return related SQLAlchemy Mapper for given SQLAlchemy object.

That function will accept a number of different types of object, test what it is, and then perform the logic necessary to return the mapper.

If you are purely looking at getting the mapper from a table, this is a function inspired from their source code without any of the type checking/handling that they do in get_mapper:

from sqlalchemy.orm import mapperlib

def find_table_mapper(tbl):
    mappers = [
        mapper for mapper in mapperlib._mapper_registry
        if tbl in mapper.tables
    ]
    if len(mappers) > 1:
        raise ValueError(
            "Multiple mappers found for table '%s'." % tbl.name
        )
    elif not mappers:
        raise ValueError(
            "Could not get mapper for table '%s'." % tbl.name
        )
    else:
        return mappers[0]
SuperShoot
  • 9,880
  • 2
  • 38
  • 55