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

时间:2014-05-02 08:11:09

标签: python sqlalchemy instantiation uuid

我是一个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()

1 个答案:

答案 0 :(得分:2)

我认为您不应该使用commit方法,而应使用flush方法:Difference between flush and commit

刷新不会将信息存储到硬盘中,但会在主键上创建所有更改:

  

主键属性在flush()过程中立即填充,因为它们是生成的,不需要调用commit()

Link to original