对SQLAlchemy来说很新(所以我的术语可能有点过时)。我想在另一个构造函数内部创建一个数据库对象,但问题是我无法将所述对象添加到会话中,因此我收到错误。
我的架构看起来有点像:
class Tag(Base):
__tablename__ = 'tag'
id = Column(Integer, Sequence('tag_id_seq'), primary_key=True, nullable=False)
type = Column(String(1), nullable=False)
name = Column(String(255), unique=True, nullable=False)
def __init__(self, type, name):
self.type=type
self.name=name
def __repr__(self):
return "<Tag('%s')>" % (self.id)
class Venue:
__tablename__ = 'venue'
tag_id = Column(Integer)
tag_type = Column(String(1), nullable=False)
location = Column(String(255), nullable=False)
tag = ForeignKeyConstraint(
(tag_id, tag_type),
(Tag.id, Tag.type),
onupdate='RESTRICT',
ondelete='RESTRICT',
)
def __init__(self,name,location):
self.tag = Tag('V',name)
self.location = location
当我执行以下操作时:
session.add(Venue("Santa's Cafe","South Pole"))
我收到错误:
UnmappedInstanceError: Class '__builtin__.instance' is not mapped
我认为这是因为在Venue的构造函数中创建的Tag对象未添加到会话中。我的问题是如何/何时这样做。 (如果可能的话,我真的更喜欢在构造函数中创建Tag对象)。我想我可以用scoped_session做到这一点,但这似乎是一个非常糟糕的解决方案。
由于
答案 0 :(得分:2)
Venue
继承Base
。否则Venue
将不会被映射。ForeignKeyConstraint
移至__table_args__
。tag
属性替换为relationship
至Tag
。 cascade
relationship
参数的默认值包含'save-update'
规则,该规则将新的引用对象添加到与父项相同的会话中。
save-update
- 级联Session.add()
操作。这个级联 适用于add()
的未来和过去调用,表示新项目 添加到集合或标量关系放入相同 会话作为父级的会话,也适用于具有的会话 已被从这种关系中删除,但仍然是未刷新的一部分 历史。