2016-09-14 2 views
0

docs say (в конце связанного раздела):Немедленное против нагрузки на первом доступе наличие

После сеанса вставляет новые строки в базе данных, все вновь сформированные идентификаторы и базы данных сгенерированные по умолчанию становятся доступными на экземпляре либо сразу, либо через загрузку при первом доступе.

В чем разница между immediately и load-on-first-access? Не знает ли SQLAlchemy новые идентификаторы и значения по умолчанию после завершения операции INSERT, и поэтому они не становятся доступными даже без перезагрузки?

+0

Я думаю, что это больше относится к «созданным по умолчанию значениям по умолчанию», чем «вновь сгенерированные идентификаторы». – univerio

+0

@univerio Получил это, я отредактировал мой вопрос, чтобы было ясно. – max

ответ

1

SQLAlchemy использует INSERT .. RETURNING для БД, которые поддерживают его для извлечения первичных ключей или специальных функций, таких как mysql_insert_id для БД, которые этого не делают.

Для значений по умолчанию он пытается использовать RETURNING, но если он не поддерживается, он должен использовать другой SELECT.

Кроме того, оно не может быть возможным использовать RETURNING (даже на поддерживаемых БД) в определенных ситуациях (например, когда INSERT заявления порционный см this mailing list post).

И наконец, SQLAlchemy по умолчанию извлекает первичный ключ после INSERT. Таким образом, только первичный ключ доступен «немедленно», а неустановленные столбцы по умолчанию - «load-on-first-access». Если вам нужно получить сгенерированные значения, укажите server_default=FetchedValue(). (В случае, когда БД не поддерживает RETURNING, и вы указываете FetchedValue для столбца, я не уверен, что он по-прежнему извлекает значение с помощью немедленного SELECT или просто возвращается к «загрузке на первый доступ».)

1

немедленно: SQLAlchemy получает первичный ключ из базы данных для каждого вставленного объекта сеанса и присваивает его объекту сеанса. Объект сеанса нуждается в первичном ключе сразу, так как до момента совершения моментального снимка транзакции объект переходит в постоянное состояние и добавляется в коллекцию Identity Map, которая связывает его с основным ключом. [The SQLAlchemy Session - In Depth]

load-on-first-access: сгенерированные по умолчанию значения по умолчанию, связанные с объектом, никогда не могут использоваться в его сеансе. Таким образом, чтобы сохранить ресурсы, это lazy loaded по мере необходимости.

+0

'никогда не может использоваться', потому что для их использования нужно хранить и извлекать объект, что невозможно за один сезон? – max