2010-06-01 84 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的关系)。否则,很难说没有更多的信息。