tl; dr - обновления не фактически переданы в базу данных - они являются частью незавершенной транзакции в процессе.
Я сделал 2 отдельных изменения в вашемвызовите create_engine ().(Кроме этой строки, я использую ваш код в точности так, как написано.)
Первый был
engine = create_engine('sqlite://', echo = True)
. Это дает некоторую полезную информацию.Я не собираюсь публиковать здесь весь вывод, но обратите внимание, что никакие команды обновления SQL не выдаются до после второго вызова list_users ():
...
After:
xxxx-xx-xx xx:xx:xx,xxx INFO sqlalchemy.engine.base.Engine.0x...d3d0 UPDATE users SET age=? WHERE users.id = ?
xxxx-xx-xx xx:xx:xx,xxx INFO sqlalchemy.engine.base.Engine.0x...d3d0 (10, 1)
...
Этоподсказка о том, что данные не сохраняются, а хранятся в объекте сеанса.
Второе изменение, которое я сделал, - сохранение базы данных в файле с
engine = create_engine('sqlite:///db.sqlite', echo = True)
Повторное выполнение сценария.обеспечивает тот же вывод, что и для второго вызова list_users ():
<User(name='A', age=10)>
<User(name='B', age=20)>
<User(name='C', age=30)>
Однако, если вы сейчас откроете только что созданную базу данных и запросите ее содержимое, вы увидите, что добавленные пользователи были сохранены вбаза данных, но возрастные изменения не были:
$ sqlite3 db.sqlite "select * from users"
1|A|0
2|B|0
3|C|0
Итак, второй вызов list_users () получает значения из объекта сеанса, а не из базы данных, потому что выполняется транзакция, котораяеще не было совершеноЧтобы доказать это, добавьте следующие строки в конец вашего скрипта:
s = get_session()
s.rollback()
print '\nAfter rollback:'
list_users()