SQLAlchemy - 如何在提交/更新/查询前获取对象的UUID?
我是一名新手,想在把主要模型的UUID存入数据库之前,自动生成这个UUID。我不想为了获取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
我使用的模型类如下:
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()
1 个回答
3
我想你应该使用的是 flush
方法,而不是 commit
方法:flush和commit之间的区别。
Flush 并不会把信息存储到硬盘上,而是会在主键上创建所有的更改:
在 flush() 过程中,主键属性会立即被填充,因为它们是被生成的,并且不需要调用 commit()。