2010-06-01 146 views
1

這是一個初學者級別的問題。SQLAlchemy中的多對一關係

我有一個目錄mtypes的:

mtype_id name 
     1 'mtype1' 
     2 'mtype2' 
[etc] 

和對象的目錄,其中必須有一個相關的MTYPE:通過創建

obj_id mtype_id name 
    1  1 'obj1' 
    2  1 'obj2' 
    3  2 'obj3' 
[etc] 

我試圖做到這一點在SQLAlchemy的下面模式:

mtypes_table = Table('mtypes', metadata, 
Column('mtype_id', Integer, primary_key=True), 
Column('name', String(50), nullable=False, unique=True), 
) 

objs_table = Table('objects', metadata, 
Column('obj_id', Integer, primary_key=True), 
Column('mtype_id', None, ForeignKey('mtypes.mtype_id')), 
Column('name', String(50), nullable=False, unique=True), 
) 

mapper(MType, mtypes_table) 
mapper(MyObject, objs_table, 
properties={'mtype':Relationship(MType, backref='objs', cascade="all, delete-orphan")} 
) 

當我嘗試添加一個簡單的元素,如:

mtype1 = MType('mtype1') 
obj1 = MyObject('obj1') 
obj1.mtype=mtype1 
session.add(obj1) 

我得到的錯誤:

AttributeError: 'NoneType' object has no attribute 'cascade_iterator' 

任何想法?

+0

這將是很高興看到完整的回溯至少或甚至完整的代碼樣本來重現問題。 – 2010-06-02 11:53:14

回答

0

我能跑,你在上面所示的代碼,所以我想這個問題是當您爲了這個問題而簡化它時會被刪除。那是對的嗎?

您沒有顯示回溯信息,因此只能給出一些常規提示。

在SQLAlchemy(至少在0.5.8及以上版本)中,只有兩個具有「cascade_iterator」屬性的對象:sqlalchemy.orm.mapper.Mapper和sqlalchemy.orm.interfaces.MapperProperty。

因爲你沒有得到sqlalchemy.orm.exc.UnmappedClassError異常(所有映射器都是他們應該在的地方),我的猜測是某些內部sqlalchemy代碼在某處應該得到一個MapperProperty實例。

把類似的東西導致異常這才session.add()調用之前:

from sqlalchemy.orm import class_mapper 
from sqlalchemy.orm.interfaces import MapperProperty 

props = [p for p in class_mapper(MyObject).iterate_properties] 
test = [isinstance(p, MapperProperty) for p in props] 
invalid_prop = None 
if False in test: 
    invalid_prop = props[test.index(False)] 

,然後用自己喜歡的方法(印刷,蟒蛇-m,pdb.set_trace(),... )來檢查invalid_prop的值。這可能是由於某種原因,它不會是無,並有罪魁禍首。

如果type(invalid_prop)是sqlalchemy.orm.properties.RelationshipProperty,那麼您已經在映射器配置中引入了一個錯誤(對於名爲invalid_prop.key的關係)。否則,很難說沒有更多的信息。

相關問題