我是SQLAlchemy的新手,如果这是一个非常愚蠢的问题,请道歉。
我按照SQLA网站上的示例设置了一个简单的1对多父/子关系,没有太多麻烦。但是,在构建子节点时,我很难将初始值从父节点传递给子节点。
我怀疑这与父类成员实际分配值的时间有关,但如果有人可以解释'正确'的方法,或者其他一些解决办法,我真的很感激。
我的代码如下
class FoobarDefinition(Base):
id = Column(Integer, Sequence('my_defn_id_seq'), primary_key=True)
children = relationship("Foobar", backref="definition")
start = Column(Integer, default=0)
thing = Column(String, default="Widget")
def createFoobar(self):
foobar = Foobar(self.id, self.thing)
self.children.append(foobar)
return foobar
class Foobar(Base):
id = Column(Integer, Sequence('my_id_seq'), primary_key=True)
definition_id = Column(Integer, ForeignKey('FOOBAR_DEFINITION.id'))
states = relationship("FoobarState", backref="Foobar")
thing = Column(String)
created = Column(DateTime, default=datetime.now)
updated = Column(DateTime, default=datetime.now, onupdate=datetime.now)
def __init__(self, spec_id, thing):
self.spec_id = spec_id
self.thing = thing
SQL日志的相关部分如下:
2014-05-18 17:27:07,678 INFO sqlalchemy.engine.base.Engine INSERT INTO“FOOBAR_DEFINITION”(start,thing)VALUES(?,?)
2014-05-18 17:27:07,679 INFO sqlalchemy.engine.base.Engine(0,'Widget')< --- good
2014-05-18 17:27:07,680 INFO sqlalchemy.engine.base.Engine INSERT INTO“FOOBAR”(definition_id,thing,created,updated)VALUES(?,?,?,?)
2014-05-18 17:27:07,681 INFO sqlalchemy.engine.base.Engine(1,None,'2014-05-18 17:27:07.680650','2014-05-18 17:27:07.680668 ')< --- bad(2nd arg is None)
这里显示的问题是插入FOOBAR应该将'Widget'作为其第二个值,而不是None。该值从FOOBAR_DEFINITION传播,该插入的正确值为'Widget'。
感谢任何建议!
答案 0 :(得分:0)
如果FoobarDefinition
使用thing
列的default
值,这只是一个问题,因为实例上的值("Widget"
)未设置,但{将数据刷新到数据库时插入{1}}。
您可以在新实例初始化期间设置默认值,例如:
only
或只是始终提供此字段的值。