SQLAlchemy从Table对象(从元数据或Session或其他方式)获取Mapper对象

时间:2018-07-26 01:32:45

标签: python orm sqlalchemy

我偶尔会遇到这样的情况:我有一个表对象(例如由reg.out <- lapply(1:nrow(dt), function(i) { reg.mets <- withTimeout( tryCatch( 1 * dt$dim1[i]), error = function(e) NULL), timeout = 60, onTimeout = "silent") }) 检索到),并且想要获得Mapper对象,该对象定义了从某些用户定义的类到Table的映射(并且然后最终是映射的类)

在上下文中,我有:

  • 一个Metadata.tables对象;

  • 一个sqlalchemy.schema.Table对象;

  • 表示当前会话的sqlalchemy.schema.MetaData对象。

我想要的是sqlalchemy.orm.session.Session对象,该对象定义了用户定义的类和上面的sqlalchemy.orm.mapper.Mapper对象之间的映射。我找不到通过文档或通过检查这些对象及其可用方法来实现此目的的方法。有什么办法吗?

1 个答案:

答案 0 :(得分:2)

SQLAlchemy-utils具有一个名为get_mapper的功能:

  

为给定的SQLAlchemy对象返回相关的SQLAlchemy映射器。

该函数将接受许多不同类型的对象,测试它是什么,然后执行返回映射器所需的逻辑。

如果您纯粹是从表中获取映射器,则此功能是从其source code启发而来的,而没有他们在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]