2013-03-11 3 views
1

Я хочу динамически получить класс сопоставления SQLAlchemy, который использует экземпляры InstrumentedList.Python + SQLAlchemy: Получение класса сопоставления из InstrumentedList?

У меня есть 1-M ParentClass-ChildClass (давайте позвоним столбцу myRelation), а parentInstance.myRelation - экземпляры InstrumentedList. Я мог взломать его и захватить класс первого экземпляра в InstrumentedList, но это не работает, если в InstrumentedList нет объектов.

Причина: мне нужно добавить словарь инструментов Python, содержащий свойства класса mapper X, в InstrumentedList, но я не знаю класс mapper во время выполнения. Поскольку я не могу добавить dict, мне нужно получить класс 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_ 

Документов inspect->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

Смежные вопросы