Ответы:
Ваш пример кода должен был работать как есть. SQLAlchemy должен предоставлять значение f.id
, предполагая, что это автоматически генерируемый столбец первичного ключа. Атрибуты первичного ключа заполняются непосредственно в flush()
процессе по мере их создания, и при этом не commit()
требуется вызова . Итак, ответ здесь заключается в одном или нескольких из следующих пунктов:
Я только что столкнулся с той же проблемой и после тестирования обнаружил, что НИКАКОГО из этих ответов недостаточно.
В настоящее время или в sqlalchemy .6+ существует очень простое решение (я не знаю, существует ли оно в предыдущей версии, хотя я думаю, что это так):
session.refresh ()
Итак, ваш код будет выглядеть примерно так:
f = Foo(bar=x)
session.add(f)
session.flush()
# At this point, the object f has been pushed to the DB,
# and has been automatically assigned a unique primary key id
f.id
# is None
session.refresh(f)
# refresh updates given object in the session with its state in the DB
# (and can also only refresh certain attributes - search for documentation)
f.id
# is the automatically assigned primary key ID given in the database.
Вот как это сделать.
sessionmaker(autoflush=True)
, эта комбинация с обновлением () предоставила мне идентификатор строки. #grrr
flush()
и commit()
, вот хорошее объяснение: stackoverflow.com/a/4202016/1252290
flush()
использования commit()
и сразу после этого - обновите его session.refresh(f)
, у меня работает, и я использую версию SQLAlchemy0.6.7
Спасибо всем. Я решил свою проблему, изменив отображение столбцов. Для меня autoincrement=True
это обязательно.
происхождение:
id = Column('ID', Integer, primary_key=True, nullable=False)
после изменения:
id = Column('ID', Integer, primary_key=True, autoincrement=True, nullable=True)
затем
session.flush()
print(f.id)
в порядке!
в отличие от ответа dpb, обновление не требуется. после промывки вы можете получить доступ к полю id, sqlalchemy автоматически обновит идентификатор, который автоматически генерируется на бэкэнде
Я столкнулся с этой проблемой и выяснил точную причину после некоторого расследования, моя модель была создана с идентификатором как целочисленное поле, а в моей форме идентификатор был представлен с помощью скрытого поля (поскольку я не хотел показывать идентификатор в своей форме). Скрытое поле по умолчанию представлено в виде текста. как только я изменил форму на целочисленное поле с помощью widget = hiddenInput ()), проблема была решена.
Вам следует попробовать использовать session.save_or_update(f)
вместо session.add(f)
.
save_or_update
устарел с 0.5 или около того. session.add()
должен это сделать.
echo=True
и посмотреть, какой SQL выполняется во время сброса? То, что вы описываете, должно работать и давать вам идентификатор, но может быть другая проблема, из-за которой f.id имеет значение None.