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