Я хотел бы использовать SQLalchemy для обновления строк в потенциально большой таблице с помощью интерфейса ORM. Но я кое-что не понимаю.
Мой вопрос: если у меня есть один сеанс, выполняющий повторяющиеся выборки и некоторые обновления, происходят ли эти обновления в базе данных или они иногда буферизуются в каком-либо объекте кеша ORM?
Например, если я повторяю выборку в сеансе, в результате получается 10 таких строк:
session.query('User').filter(User.val == 42, User.surname == 'Dent')
.. но я обновляю только последнюю строку из этих 10,
Непонятно, что вы имеете в виду под «использовать кешированные значения для обновлений», но я постараюсь в общих чертах обрисовать поведение:
query = session.query(User).filter(...)
Это ничего не делает с базой данных. Создает объект Query
, представляющий ваш запрос.
users = query.all()
# or
for user in query:
...
При этом всегда будет выполняться запрос SELECT
для извлечения строк из базы данных преобразует их в объекты в памяти и их размещения в карте идентичности. (Возможно, это то, что вы подразумеваете под кешем.)
user = users[0]
user.surname = "Bar"
Это фиксирует тот факт, что вы хотите обновить столбец surname
до "Bar"
, но на самом деле он ничего не делает с базой данных.
session.flush()
Это вызывает запросы UPDATE
к базе данных.
session.commit()
Этот сбрасывается, если есть ожидающие изменения выдает запрос COMMIT
и (по умолчанию) истекает все экземпляры в карте идентичности, так что выполнение user.surname
в этот момент выдает запрос SELECT
(но только для этой строки, то есть SELECT ... WHERE id = ...
).