SQLAlchemy - 如何在提交/更新/查询前获取对象的UUID?

1 投票
1 回答
2077 浏览
提问于 2025-04-18 05:06

我是一名新手,想在把主要模型的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()。

原始链接

撰写回答