SQLAlchemy - Как сделать 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

Класс 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 ответ

Решение

Я полагаю, что вы должны использовать не commit метод но flush Метод: Разница между флешем и коммитом.

Flush не хранит информацию на жестком диске, но создает все изменения в первичном ключе:

Атрибуты первичного ключа заполняются сразу в процессе flush(), поскольку они генерируются, и не требуется никакого вызова commit()

Ссылка на оригинал

Другие вопросы по тегам