这是一个初级问题。在
我有多个类型的目录:
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'
有什么想法吗?在
我能够运行您上面显示的代码,所以我想当您为了这个问题而简化它时,问题已经被消除了。对吗?在
你没有显示回溯,所以只能给出一些一般的提示。在
在SQLAlchemy中(至少在0.5.8及更高版本中),只有两个对象具有“cascade_iterator”属性:sqlalchemy.orm.mapper.Mapper和sqlalchemy.orm.interfaces.MapperProperty。在
因为你没有sqlalchemy.orm.exc.UnmappedClassError异常(所有映射器都在应该的位置)我的猜测是,一些内部sqlalchemy代码在应该获得MapperProperty实例的地方没有得到任何结果。在
把这样的东西放在前面会话.add()导致异常的调用:
然后使用你最喜欢的方法(print,python-m,pdb.set_跟踪(),…)来检查无效的属性值。很可能因为某种原因,它不会是没有的,而你的罪魁祸首就在那里。在
如果类型(无效的属性)是sqlalchemy.orm.properties.RelationshipProperty则在映射器配置中引入了一个bug(对于名为invalid的关系_道具钥匙). 否则,如果没有更多的信息很难判断。在
您是否尝试过:
而不是:
^{pr2}$另请参见:http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/schema.html#sqlalchemy.schema.ForeignKey
相关问题 更多 >
编程相关推荐