Відповіді:
Ваш зразок коду мав би працювати так, як є. 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)
, що комбо w / refresh () надало мені ідентифікатор рядка #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, оновити не потрібно. Після того, як ви вмикаєте, ви можете отримати доступ до поля ідентифікатора, sqlalchemy автоматично оновлює ідентифікатор, який автоматично генерується у бекенді
Я зіткнувся з цією проблемою і зрозумів точну причину після деякого розслідування, моя модель була створена з ідентифікатором як цілим полем, і в моїй формі ідентифікатор був представлений прихованим полем (оскільки я не хотів показувати ідентифікатор у своїй формі). Приховане поле за замовчуванням представлено у вигляді тексту. як тільки я змінив форму на integerfield з віджетом = hiddenInput ()) проблема була вирішена.
Спробуйте використовувати session.save_or_update(f)
замість session.add(f)
.
save_or_update
застаріла з 0,5 або більше. session.add()
повинен це зробити.
echo=True
і побачити, що SQL виконується в поточний час? Те, що ви описуєте, повинно працювати і дати вам ідентифікатор, але може виникнути інша проблема, яка призводить до того, що f.id не буде None.