我是一个noobie尝试让主模型的主UUID在存储到DB之前自动实例化,我不想将对象提交到db只是为了获得UUID。
下面的简短片段来自我的实际代码。
我想我需要将初始化附加到一些SQLAlchemy钩子中,但我不知道哪个或如何。
我有一个UUID助手,如下所示
class GUID(TypeDecorator):
impl = types.LargeBinary
...
我在表格中使用
class Row(Model,Base):
__tablename__ = "Row"
id = Column(GUID(), primary_key=True, default=uuid.uuid4)
row_text = Column(Unicode, index=True)
original_row_index = Column(Integer)
当我做这个测试时:
def test_uuid():
row_text = "Just a plain row."
irow = 0
row = Row(row_text, irow)
row.save()
row.commit()
if row.id == None:
print ("row.id == None")
else:
print ("row.id set")
row2 = Row(row_text, irow)
row2.save()
if row2.id == None:
print ("row2.id == None")
else:
print ("row2.id set")
打印
row.id set row2.id == None
我使用的Model类如下:
class Model():
def __init__(self):
pass
def save(self):
db = Db.instance()
db.session.add(self)
def commit(self):
db = Db.instance()
db.session.commit()
答案 0 :(得分:2)
我认为您不应该使用commit
方法,而应使用flush
方法:Difference between flush and commit。
刷新不会将信息存储到硬盘中,但会在主键上创建所有更改:
主键属性在flush()过程中立即填充,因为它们是生成的,不需要调用commit()