0

这是一个初学者级别的问题。

我有一个 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'

有任何想法吗?

4

2 回答 2

2

Have you tried:

Column('mtype_id', ForeignKey('mtypes.mtype_id')),

instead of:

Column('mtype_id', None, ForeignKey('mtypes.mtype_id')),

See also: https://docs.sqlalchemy.org/en/13/core/constraints.html

于 2010-06-02T11:56:06.813 回答
0

我能够运行您在上面显示的代码,所以我想当您出于此问题的目的对其进行简化时问题已被删除。那是对的吗?

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

在 SQLAlchemy(至少在 0.5.8 及更高版本中)只有两个具有“cascade_iterator”属性的对象:sqlalchemy.orm.mapper.Mapper 和 sqlalchemy.orm.interfaces.MapperProperty。

由于你没有得到 sqlalchemy.orm.exc.UnmappedClassError 异常(所有映射器都在它们应该在的地方),我疯狂的猜测是,一些内部 sqlalchemy 代码在应该得到 MapperProperty 实例的地方得到 None 。

在导致异常的 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)]

然后使用您喜欢的方法(print、python -m、pdb.set_trace()、...)检查 invalid_prop 的值。很可能由于某种原因它不会是 None 并且是你的罪魁祸首。

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

于 2010-06-07T15:00:06.403 回答