Я хочу сделать что-то вроде этого:
f = Foo(bar='x')
session.add(f)
session.flush()
# do additional queries using f.id before commit()
print f.id # should be not None
session.commit()
Но f.id
это None
когда я попробую. Как я могу заставить это работать?
python
sqlalchemy
Eloff
источник
источник
echo=True
и посмотреть, какой SQL выполняется во время сброса? То, что вы описываете, должно работать и давать вам идентификатор, но может быть другая проблема, из-за которой f.id имеет значение None.Ответы:
Ваш пример кода должен был работать как есть. SQLAlchemy должен предоставлять значение
f.id
, предполагая, что это автоматически генерируемый столбец первичного ключа. Атрибуты первичного ключа заполняются непосредственно вflush()
процессе по мере их создания, и при этом неcommit()
требуется вызова . Итак, ответ здесь заключается в одном или нескольких из следующих пунктов:источник
Я только что столкнулся с той же проблемой и после тестирования обнаружил, что НИКАКОГО из этих ответов недостаточно.
В настоящее время или в sqlalchemy .6+ существует очень простое решение (я не знаю, существует ли оно в предыдущей версии, хотя я думаю, что это так):
session.refresh ()
Итак, ваш код будет выглядеть примерно так:
Вот как это сделать.
источник
sessionmaker(autoflush=True)
, эта комбинация с обновлением () предоставила мне идентификатор строки. #grrrflush()
иcommit()
, вот хорошее объяснение: stackoverflow.com/a/4202016/1252290flush()
использованияcommit()
и сразу после этого - обновите егоsession.refresh(f)
, у меня работает, и я использую версию SQLAlchemy0.6.7
Спасибо всем. Я решил свою проблему, изменив отображение столбцов. Для меня
autoincrement=True
это обязательно.происхождение:
после изменения:
затем
в порядке!
источник
в отличие от ответа dpb, обновление не требуется. после промывки вы можете получить доступ к полю id, sqlalchemy автоматически обновит идентификатор, который автоматически генерируется на бэкэнде
Я столкнулся с этой проблемой и выяснил точную причину после некоторого расследования, моя модель была создана с идентификатором как целочисленное поле, а в моей форме идентификатор был представлен с помощью скрытого поля (поскольку я не хотел показывать идентификатор в своей форме). Скрытое поле по умолчанию представлено в виде текста. как только я изменил форму на целочисленное поле с помощью widget = hiddenInput ()), проблема была решена.
источник
Однажды у меня была проблема с назначением
0
id перед вызовомsession.add
метода. Идентификатор был правильно назначен базой данных, но после этого правильный идентификатор не был получен из сеансаsession.flush()
.источник
Вам следует попробовать использовать
session.save_or_update(f)
вместоsession.add(f)
.источник
save_or_update
устарел с 0.5 или около того.session.add()
должен это сделать.