在SQLAlchemy的多到一的关系(Many-to-one relationship in SQL

2019-10-22 13:56发布

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

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

有任何想法吗?

Answer 1:

你有没有尝试过:

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



Answer 2:

我能跑,你已经证明上面,所以我想,当你简化它这个问题的目的是去除该问题的代码。 那是对的吗?

你并没有表现出回溯所以只有几个方法可以给出。

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



文章来源: Many-to-one relationship in SQLAlchemy