1

I'm a noobie trying get primary model's primary UUID automatically instantiated before it's stored into DB, I would not like to commit objects into db just to get the UUID available.

The short snippets below are from the actual code I have.

I think I need to attach initialization into some SQLAlchemy hook, but I don't know which or how.

I have an UUID helper as follows

class GUID(TypeDecorator):
    impl = types.LargeBinary
    ...

the in the tables I use

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)

when I do this test:

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")

it prints

    row.id set
    row2.id == None

The Model class I use is as follows:

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 Answers1

3

I suppose that your should use not commit method but flush method: Difference between flush and commit.

Flush not store information into the hard disk but create all changes on primary key:

Primary key attributes are populated immediately within the flush() process as they are generated and no call to commit() should be required

Link to original

Community
  • 1
  • 1
mblw
  • 1,762
  • 1
  • 19
  • 28