这是一个初学者级别的问题。
我有一个目录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'
有任何想法吗?
你有没有尝试过:
Column('mtype_id', ForeignKey('mtypes.mtype_id')),
代替:
Column('mtype_id', None, ForeignKey('mtypes.mtype_id')),
参见: http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/schema.html#sqlalchemy.schema.ForeignKey
我能跑,你已经证明上面,所以我想,当你简化它这个问题的目的是去除该问题的代码。 那是对的吗?
你并没有表现出回溯所以只有几个方法可以给出。
在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关系)。 否则,很难说没有更多的信息。