Ответ 1
Немного взглянув на источник SQLAlchemy, он выглядит как записи add()
когда он был вставлен: https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/orm/session.py#L1719
Соответствующий фрагмент:
def _save_impl(self, state):
if state.key is not None:
raise sa_exc.InvalidRequestError(
"Object '%s' already has an identity - it can't be registered "
"as pending" % state_str(state))
self._before_attach(state)
if state not in self._new:
self._new[state] = state.obj()
state.insert_order = len(self._new) # THE INSERT ORDER IS SAVED!
self._attach(state)
И это вызывается из Session.add
=> self._save_or_update_state
=> self._save_or_update_impl
=> self._save_impl
.
Затем он используется в _sort_states
при сохранении: https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/orm/persistence.py#L859
К сожалению, это только доказательство уровня реализации. Я не мог найти ничего в документации, которая гарантирует это...
Обновление: с тех пор я немного поучаствовал в этом, получилось понятие "Единица работы в SQLAlchemy", которое несколько определяет порядок во время флеша: http://www.aosabook.org/en/sqlalchemy.html ( поиск Единицы работы).
В том же классе порядок действительно определяется порядком add
. Тем не менее, вы можете видеть разные порядки в INSERT между разными классами. Если вы добавите объект a
типа A
и позже добавьте объект b
типа B
, но a
окажется, что у него есть внешний ключ, b
вы увидите INSERT для b
до INSERT для a
.