Python 炼金术中的多对一关系

Python 炼金术中的多对一关系,python,database-design,sqlalchemy,many-to-one,Python,Database Design,Sqlalchemy,Many To One,这是一个初级问题 我有一个MTYPE目录: 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 = Tabl

这是一个初级问题

我有一个MTYPE目录:

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')),

另请参见:

我能够运行您上面显示的代码,因此我猜在您为解决此问题而对其进行简化时,问题已经解决。对吗

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

在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)]
然后使用您最喜欢的方法(print、python-m、pdb.set_trace(),…)检查invalid_prop的值。由于某种原因,它可能不会是零,而罪魁祸首就在那里


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

最好能看到完整的回溯,至少是完整的代码样本来重现问题。找不到页面。大概