2013-03-11 48 views
1

我想动态获取InstrumentedList实例使用的SQLAlchemy映射器类。Python + SQLAlchemy:从InstrumentedList获取映射器类?

我有一个1-M的ParentClass-ChildClass(让我们调用列myRelation),parentInstance.myRelation是InstrumentedList实例。我可以破解它并获取InstrumentedList中第一个实例的类,但如果InstrumentedList中没有对象,则这不起作用。

原因:我需要将包含mapper类X属性的Python字典追加到InstrumentedList,但我不知道运行时的mapper类。由于我无法附加字典,我需要获取映射器类。

谢谢。

回答

4

该关系通过property与仪表列表关联。所以用这种普通的香草映射开始:

from sqlalchemy import * 
from sqlalchemy.orm import * 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class A(Base): 
    __tablename__ = "a" 
    id = Column(Integer, primary_key=True) 
    bs = relationship("B") 

class B(Base): 
    __tablename__ = "b" 
    id = Column(Integer, primary_key=True) 
    a_id = Column(Integer, ForeignKey('a.id')) 

在任何最新版本的SQLAlchemy的,你可以看到它是这样的:

print A.bs.property.mapper.class_ 

在0.8有更多一点的API可用,你可以这样做:

from sqlalchemy import inspect 
print inspect(A.bs).mapper.class_ 

文档用于查阅─>http://docs.sqlalchemy.org/en/rel_0_8/core/inspection.html

文档为“地图per-> class_“ - >http://docs.sqlalchemy.org/en/rel_0_8/orm/mapper_config.html#sqlalchemy.orm.mapper.Mapper.class_

+0

你的答案是绝对有用的,但我发现你可以在较新的SQLAlchemy(1.x)中做A.bs.mapper.class_(至少对于我的关系定义它有效) – Drachenfels 2015-04-30 11:49:42