当我尝试将映射到继承另一个表的对象写出时,出现了NULL身份键错误。我发现在使用声明性方法时,此示例可以正常工作,但在使用传统方法时无法正常工作。
表格设置如下:
错误显示为:
表格设置如下:
objecttypes = Table('objecttypes', metadata,
Column('id', Integer, primary_key=True),
Column('name', String)
)
things = Table('things', metadata,
Column('id', Integer, primary_key=True, autoincrement=True),
Column('name', String),
Column('object_type_id', Integer, ForeignKey('objecttypes.id')),
Column('version', Integer),
Column('timeCreated', DateTime)
)
locations = Table('locations', metadata,
Column('id', Integer, ForeignKey('things.id'), primary_key=True))
objecttypes = Table('objecttypes', metadata,
Column('id', Integer, primary_key=True),
Column('name', String)
)
mapper(Thing, things, version_id_col=things.c.version,
polymorphic_on="object_type_id",
with_polymorphic='*',
polymorphic_load='inline',
properties={
'objectType': relationship(ObjectType, cascade_backrefs=False)
})
mapper(Location, locations, polymorphic_identity=typeDict['location'].id)
课程设置如下:
class ObjectType(object):
def __repr__(self):
return "ObjectType({}, id={})".format(self.name, self.id)
class Thing(object):
def __init__(self, **kwds):
for key in kwds:
setattr(self, key, kwds[key])
return
def __repr__(self):
return "{}, id={}, type={}, version={}".format(self.name, self.id, self.objectType, self.version)
class Location(Thing):
pass
当我尝试创建和合并新位置时,出现了错误:
def write(obj):
session = scopedSessionFactory()
obj = session.merge(obj)
session.commit()
return obj
# typeDict is a predefined list ObjectType records
tokyo = Location(name="tokyo", objectType=typeDict['location'])
tokyo = write(tokyo)
错误显示为:
sqlalchemy.orm.exc.FlushError: Instance <Location at 0x10473a950> has a NULL identity key.
完整示例可作为gist使用。
mapper(Location,locations,inherits=Thing,polymorphic_identity = typeDict ['location'] .id)
。我觉得您漏掉了inherits = Thing
。 - fedepad