Может ли SQLAlchemy кешировать обновления - PullRequest
0 голосов
/ 01 мая 2018

Я бы хотел использовать SQLalchemy для обновления строк в потенциально большой таблице с использованием интерфейса ORM. Но мне что-то не понятно.

У меня вопрос, если у меня один сеанс повторного выбора и некоторых обновлений, происходят ли эти обновления в базе данных или они иногда буферизируются в каком-либо объекте кэша ORM?

Например, если я повторяю выборку с сеансом, который выдает 10 строк, например:

session.query('User').filter(User.val == 42, User.surname == 'Dent')

.. но я обновляю только последнюю строку из этих 10,

  1. Будет ли ORM всегда извлекать одни и те же 10 строк из БД или будет использовать кэшированные значения?
  2. Изменится ли поведение кэширования с маркерами транзакций?

1 Ответ

0 голосов
/ 01 мая 2018

Непонятно, что вы подразумеваете под «использовать кэшированные значения для обновлений», но я постараюсь описать общее поведение:

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 = ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...