2013-03-11 77 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