这是一个初学者的问题。

我有一个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.schema.foreignkey

其他提示

我能够运行您上面显示的代码,因此我想当您将问题简化为此目的时,该问题已被删除。那是对的吗?

您没有显示回溯,因此只能提供一些一般提示。

在sqlalchemy(至少在0.5.8及以上)中,只有两个对象具有“ cascade_iterator”属性:sqlalchemy.orm.orm.mapper.mapper.mapper和sqlalchemy.orm.orm.interfaces.mapperproperty。

由于您没有得到sqlalchemy.orm.orm.exc.unmappedclasserror异常(所有映射器都正确的位置),我的疯狂猜测是,某些内部sqlalchemy代码在某个地方没有得到mmapperproperty实例。

在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)]

然后使用您喜欢的方法(打印,python -m,pdb.set_trace(),...)检查Invalid_prop的值。由于某种原因,这可能不会没有,这可能是您的罪魁祸首。

如果type(Invalid_prop)是sqlalchemy.orm.properties.relationshipproperty,那么您已经在映射器配置中引入了一个错误(对于名为invalid_prop.key的关系)。否则,很难没有更多信息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top