SQLAlchemy中的多音关系

2024-10-01 13:38:30 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个初级问题。在

我有多个类型的目录:

mtype_id name
       1 'mtype1'
       2 'mtype2'
[etc]

以及对象目录,其中必须具有关联的mtype:

^{pr2}$

我尝试在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'

有什么想法吗?在


Tags: name目录idtruetablecolumnintegermetadata
2条回答

我能够运行您上面显示的代码,所以我想当您为了这个问题而简化它时,问题已经被消除了。对吗?在

你没有显示回溯,所以只能给出一些一般的提示。在

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

因为你没有sqlalchemy.orm.exc.UnmappedClassError异常(所有映射器都在应该的位置)我的猜测是,一些内部sqlalchemy代码在应该获得MapperProperty实例的地方没有得到任何结果。在

把这样的东西放在前面会话.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_跟踪(),…)来检查无效的属性值。很可能因为某种原因,它不会是没有的,而你的罪魁祸首就在那里。在

如果类型(无效的属性)是sqlalchemy.orm.properties.RelationshipProperty则在映射器配置中引入了一个bug(对于名为invalid的关系_道具钥匙). 否则,如果没有更多的信息很难判断。在

您是否尝试过:

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

而不是:

^{pr2}$

另请参见:http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/schema.html#sqlalchemy.schema.ForeignKey

相关问题 更多 >