API сессии¶
Session и sessionmaker()¶
Object Name | Description |
---|---|
Представляет собой вызов метода |
|
Управляет операциями персистентности для объектов, отображенных в ORM. |
|
Конфигурируемая фабрика |
|
Транзакция уровня |
|
указывает на происхождение |
- class sqlalchemy.orm.sessionmaker¶
Конфигурируемая фабрика
Session
.Фабрика
sessionmaker
при вызове генерирует новые объектыSession
, создавая их с учетом установленных здесь конфигурационных аргументов.например:
from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker # an Engine, which the Session will use for connection # resources engine = create_engine('postgresql+psycopg2://scott:tiger@localhost/') Session = sessionmaker(engine) with Session() as session: session.add(some_object) session.add(some_other_object) session.commit()
Использование менеджера контекста необязательно; в противном случае возвращаемый объект
Session
может быть закрыт явно с помощью методаSession.close()
. Использование блокаtry:/finally:
необязательно, однако оно гарантирует, что закрытие произойдет даже при наличии ошибок базы данных:session = Session() try: session.add(some_object) session.add(some_other_object) session.commit() finally: session.close()
sessionmaker
действует как фабрика для объектовSession
так же, какEngine
действует как фабрика для объектовConnection
. Таким образом, он также включает методsessionmaker.begin()
, который предоставляет контекстный менеджер, который начинает и фиксирует транзакцию, а также закрываетSession
после завершения, откатывая транзакцию, если возникают какие-либо ошибки:Session = sessionmaker(engine) with Session.begin() as session: session.add(some_object) session.add(some_other_object) # commits transaction, closes session
Добавлено в версии 1.4.
При вызове
sessionmaker
для созданияSession
в метод также могут быть переданы аргументы ключевых слов; эти аргументы будут переопределять глобально настроенные параметры. Ниже мы используемsessionmaker
, связанный с определеннымEngine
, для созданияSession
, который вместо этого связан с определеннымConnection
, полученным от этого двигателя:Session = sessionmaker(engine) # bind an individual session to a connection with engine.connect() as connection: with Session(bind=connection) as session: # work with session
Класс также включает метод
sessionmaker.configure()
, который может быть использован для указания дополнительных ключевых аргументов фабрики, которые будут действовать для последующих создаваемыхSession
объектов. Обычно это используется для того, чтобы связать один или несколько объектовEngine
с существующей фабрикойsessionmaker
перед ее первым использованием:# application starts, sessionmaker does not have # an engine bound yet Session = sessionmaker() # ... later, when an engine URL is read from a configuration # file or other events allow the engine to be created engine = create_engine('sqlite:///foo.db') Session.configure(bind=engine) sess = Session() # work with session
См.также
Открытие и закрытие сессии - вводный текст по созданию сессий с использованием
sessionmaker
.Members
__call__(), __init__(), begin(), close_all(), configure(), identity_key(), object_session()
Классная подпись
класс
sqlalchemy.orm.sessionmaker
(sqlalchemy.orm.session._SessionClassMethods
,typing.Generic
)-
method
sqlalchemy.orm.sessionmaker.
__call__(**local_kw: Any) _S ¶ Создайте новый объект
Session
, используя конфигурацию, установленную в этомsessionmaker
.В Python метод
__call__
вызывается на объекте, когда его «вызывают» так же, как и функцию:Session = sessionmaker(some_engine) session = Session() # invokes sessionmaker.__call__()
-
method
sqlalchemy.orm.sessionmaker.
__init__(bind: Optional[_SessionBind] = None, *, class_: Type[_S] = <class 'sqlalchemy.orm.session.Session'>, autoflush: bool = True, expire_on_commit: bool = True, info: Optional[_InfoType] = None, **kw: Any)¶ Создайте новый
sessionmaker
.Все аргументы здесь, кроме
class_
, соответствуют аргументам, принимаемымSession
напрямую. Более подробную информацию о параметрах см. в строке документацииSession.__init__()
.- Параметры:
bind –
Engine
или другойConnectable
, с которым будут связаны вновь создаваемыеSession
объекты.class_ – класс, который следует использовать для создания новых объектов
Session
. По умолчанию используетсяSession
.autoflush – Настройка автосмыва для вновь созданных объектов
Session
. … см. также:: Промывка - дополнительная информация об автозамывкеexpire_on_commit=True – параметр
Session.expire_on_commit
, используемый для вновь создаваемых объектовSession
.info – необязательный словарь информации, которая будет доступна через
Session.info
. Обратите внимание, что этот словарь обновляется, а не заменяется, когда параметрinfo
указан для конкретной операции построенияSession
.**kw – все остальные аргументы ключевых слов передаются в конструктор вновь создаваемых объектов
Session
.
-
method
sqlalchemy.orm.sessionmaker.
begin() AbstractContextManager[_S] ¶ Создайте менеджер контекста, который одновременно предоставляет новый
Session
, а также транзакцию, которая фиксирует.например:
Session = sessionmaker(some_engine) with Session.begin() as session: session.add(some_object) # commits transaction, closes session
Добавлено в версии 1.4.
-
classmethod
sqlalchemy.orm.sessionmaker.
close_all() None ¶ наследуется от
sqlalchemy.orm.session._SessionClassMethods.close_all
методаsqlalchemy.orm.session._SessionClassMethods
Закройте все сессии в памяти.
Не рекомендуется, начиная с версии 1.3: Метод
Session.close_all()
является устаревшим и будет удален в одном из будущих выпусков. Пожалуйста, обратитесь кclose_all_sessions()
.
-
method
sqlalchemy.orm.sessionmaker.
configure(**new_kw: Any) None ¶ (Пере)настройка аргументов для этого создателя сеанса.
например:
Session = sessionmaker() Session.configure(bind=create_engine('sqlite://'))
-
classmethod
sqlalchemy.orm.sessionmaker.
identity_key(class_: Optional[Type[Any]] = None, ident: Union[Any, Tuple[Any, ...]] = None, *, instance: Optional[Any] = None, row: Optional[Union[Row[Any], RowMapping]] = None, identity_token: Optional[Any] = None) _IdentityKeyType[Any] ¶ наследуется от
sqlalchemy.orm.session._SessionClassMethods.identity_key
методаsqlalchemy.orm.session._SessionClassMethods
Возвращает ключ идентификации.
Это псевдоним
identity_key()
.
-
classmethod
sqlalchemy.orm.sessionmaker.
object_session(instance: object) Optional[Session] ¶ наследуется от
sqlalchemy.orm.session._SessionClassMethods.object_session
методаsqlalchemy.orm.session._SessionClassMethods
Возвращает
Session
, к которому принадлежит объект.Это псевдоним
object_session()
.
-
method
- class sqlalchemy.orm.ORMExecuteState¶
Представляет собой вызов метода
Session.execute()
, переданный в крючок событияSessionEvents.do_orm_execute()
.Добавлено в версии 1.4.
См.также
Выполнение событий - документация верхнего уровня о том, как использовать
SessionEvents.do_orm_execute()
Members
__init__(), all_mappers, bind_arguments, bind_mapper, execution_options, invoke_statement(), is_column_load, is_delete, is_executemany, is_insert, is_orm_statement, is_relationship_load, is_select, is_update, lazy_loaded_from, load_options, loader_strategy_path, local_execution_options, parameters, session, statement, update_delete_options, update_execution_options(), user_defined_options
Классная подпись
класс
sqlalchemy.orm.ORMExecuteState
(sqlalchemy.util.langhelpers.MemoizedSlots
)-
method
sqlalchemy.orm.ORMExecuteState.
__init__(session: Session, statement: Executable, parameters: Optional[_CoreAnyExecuteParams], execution_options: _ExecuteOptions, bind_arguments: _BindArguments, compile_state_cls: Optional[Type[ORMCompileState]], events_todo: List[_InstanceLevelDispatch[Session]])¶ Создайте новый
ORMExecuteState
.этот объект строится внутри.
-
attribute
sqlalchemy.orm.ORMExecuteState.
all_mappers¶ Возвращает последовательность всех объектов
Mapper
, которые задействованы на верхнем уровне данного утверждения.Под «верхним уровнем» мы подразумеваем те
Mapper
объекты, которые будут представлены в строках набора результатов для запросаselect()
, или для запросаupdate()
илиdelete()
, маппер, который является основным объектом UPDATE или DELETE.Добавлено в версии 1.4.0b2.
См.также
-
attribute
sqlalchemy.orm.ORMExecuteState.
bind_arguments: _BindArguments¶ Словарь, переданный в качестве словаря
Session.execute.bind_arguments
.Этот словарь может быть использован расширениями
Session
для передачи аргументов, которые помогут определить среди множества соединений базы данных, какое из них следует использовать для вызова данного оператора.
-
attribute
sqlalchemy.orm.ORMExecuteState.
bind_mapper¶ Возвращает
Mapper
, который является основным «связующим» отображателем.Для объекта
ORMExecuteState
, вызывающего оператор ORM, то есть атрибутомORMExecuteState.is_orm_statement
являетсяTrue
, этот атрибут возвращаетMapper
, который считается «основным» отобразителем оператора. Термин «bind mapper» относится к тому факту, что объектSession
может быть «связан» с несколькими объектамиEngine
, ключами которых являются сопоставленные классы, а «bind mapper» определяет, какой из этих объектовEngine
будет выбран.Для оператора, который вызывается для одного сопоставленного класса,
ORMExecuteState.bind_mapper
является надежным способом получения этого сопоставителя.Добавлено в версии 1.4.0b2.
См.также
-
attribute
sqlalchemy.orm.ORMExecuteState.
execution_options: _ExecuteOptions¶ Полный словарь текущих вариантов исполнения.
Это объединение опций уровня оператора с локально передаваемыми опциями выполнения.
-
method
sqlalchemy.orm.ORMExecuteState.
invoke_statement(statement: Optional[Executable] = None, params: Optional[_CoreAnyExecuteParams] = None, execution_options: Optional[OrmExecuteOptionsParameter] = None, bind_arguments: Optional[_BindArguments] = None) Result[Any] ¶ Выполнить оператор, представленный этим
ORMExecuteState
, без повторного вызова событий, которые уже произошли.Этот метод, по сути, выполняет повторное центрированное выполнение текущего оператора, для которого в данный момент вызывается событие
SessionEvents.do_orm_execute()
. Этот метод используется для обработчиков событий, которые хотят переопределить способ возврата конечного объектаResult
, например, для схем, которые получают результаты из автономного кэша или объединяют результаты нескольких выполнений.Когда объект
Result
возвращается фактической функцией-обработчиком внутриSessionEvents.do_orm_execute()
и передается в вызывающий методSession.execute()
, остаток методаSession.execute()
вытесняется, и объектResult
немедленно возвращается вызывающему методуSession.execute()
.- Параметры:
statement – необязательный оператор, который будет вызван вместо оператора, представленного в данный момент
ORMExecuteState.statement
.params – необязательный словарь параметров или список параметров, которые будут объединены в существующий
ORMExecuteState.parameters
данногоORMExecuteState
. … versionchanged:: 2.0 список словарей параметров принимается для многих исполнений.execution_options – необязательный словарь опций выполнения будет объединен с существующим
ORMExecuteState.execution_options
этогоORMExecuteState
.bind_arguments – необязательный словарь bind_arguments, который будет объединен с текущим
ORMExecuteState.bind_arguments
данногоORMExecuteState
.
- Результат:
объект
Result
с результатами на уровне ORM.
См.также
Повторное выполнение заявлений - справочная информация и примеры по правильному использованию
ORMExecuteState.invoke_statement()
.
-
attribute
sqlalchemy.orm.ORMExecuteState.
is_column_load¶ Возвращает True, если операция обновляет атрибуты, ориентированные на столбцы, на существующем объекте ORM.
Это происходит во время таких операций, как
Session.refresh()
, а также при загрузке атрибута, отложенного по командеdefer()
, или при загрузке атрибута, срок действия которого истек либо непосредственно по командеSession.expire()
, либо через операцию фиксации.Обработчики, скорее всего, не захотят добавлять какие-либо опции в запросы, когда происходит такая операция, поскольку запрос должен быть прямым извлечением первичного ключа, который не должен иметь никаких дополнительных критериев WHERE, а опции загрузчика, путешествующего с экземпляром, уже будут добавлены в запрос.
Добавлено в версии 1.4.0b2.
См.также
-
attribute
sqlalchemy.orm.ORMExecuteState.
is_delete¶ return True, если это операция DELETE.
-
attribute
sqlalchemy.orm.ORMExecuteState.
is_executemany¶ return True, если параметры представляют собой многоэлементный список словарей с более чем одним словарем.
Добавлено в версии 2.0.
-
attribute
sqlalchemy.orm.ORMExecuteState.
is_insert¶ возвращает True, если это операция INSERT.
-
attribute
sqlalchemy.orm.ORMExecuteState.
is_orm_statement¶ return True, если операция является оператором ORM.
Это указывает на то, что вызываемый select(), insert(), update() или delete() содержит сущности ORM в качестве субъектов. Для оператора, который не содержит сущностей ORM и вместо этого ссылается только на метаданные
Table
, он вызывается как оператор Core SQL, и никакой автоматизации на уровне ORM не происходит.
-
attribute
sqlalchemy.orm.ORMExecuteState.
is_relationship_load¶ Возвращает True, если эта загрузка загружает объекты от имени отношения.
Это означает, что действующий загрузчик является либо LazyLoader, SelectInLoader, SubqueryLoader или подобным, и весь оператор SELECT, который выдается, выполняется от имени загрузки отношения.
Обработчики, скорее всего, не захотят добавлять какие-либо опции в запросы, когда происходит такая операция, поскольку опции загрузчика уже могут быть переданы загрузчикам отношений и должны уже присутствовать.
См.также
-
attribute
sqlalchemy.orm.ORMExecuteState.
is_select¶ return True, если это операция SELECT.
-
attribute
sqlalchemy.orm.ORMExecuteState.
is_update¶ return True, если это операция UPDATE.
-
attribute
sqlalchemy.orm.ORMExecuteState.
lazy_loaded_from¶ InstanceState
, который использует выполнение этого оператора для операции ленивой загрузки.Основное обоснование для этого атрибута - поддержка расширения горизонтального шардинга, где он доступен в определенных крючках времени выполнения запроса, созданных этим расширением. С этой целью атрибут имеет значение только во время времени выполнения запроса, и, что важно, не в любое время до этого, включая время компиляции запроса.
-
attribute
sqlalchemy.orm.ORMExecuteState.
load_options¶ Возвращает параметры load_options, которые будут использоваться для данного выполнения.
-
attribute
sqlalchemy.orm.ORMExecuteState.
loader_strategy_path¶ Возвращает
PathRegistry
для текущего пути загрузки.Этот объект представляет «путь» в запросе вдоль связей при загрузке определенного объекта или коллекции.
-
attribute
sqlalchemy.orm.ORMExecuteState.
local_execution_options: _ExecuteOptions¶ Словарное представление опций выполнения, переданных методу
Session.execute()
.Сюда не входят опции, которые могут быть связаны с вызываемым оператором.
См.также
-
attribute
sqlalchemy.orm.ORMExecuteState.
parameters: Optional[_CoreAnyExecuteParams]¶ Словарь параметров, которые были переданы в
Session.execute()
.
-
attribute
sqlalchemy.orm.ORMExecuteState.
session: Session¶ Используемый
Session
.
-
attribute
sqlalchemy.orm.ORMExecuteState.
statement: Executable¶ Вызываемый оператор SQL.
Для ORM-выбора, который был бы получен из
Query
, это экземплярselect
, который был сгенерирован из ORM-запроса.
-
attribute
sqlalchemy.orm.ORMExecuteState.
update_delete_options¶ Возвращает параметры update_delete_options, которые будут использоваться для данного выполнения.
-
method
sqlalchemy.orm.ORMExecuteState.
update_execution_options(**opts: Any) None ¶ Обновите локальные параметры выполнения новыми значениями.
-
attribute
sqlalchemy.orm.ORMExecuteState.
user_defined_options¶ Последовательность
UserDefinedOptions
, которая была связана с вызываемым оператором.
-
method
- class sqlalchemy.orm.Session¶
Управляет операциями персистентности для объектов, отображенных в ORM.
Парадигма использования сессии описана в Использование сеанса.
Members
__init__(), add(), add_all(), begin(), begin_nested(), bind_mapper(), bind_table(), bulk_insert_mappings(), bulk_save_objects(), bulk_update_mappings(), close(), close_all(), commit(), connection(), delete(), deleted, dirty, enable_relationship_loading(), execute(), expire(), expire_all(), expunge(), expunge_all(), flush(), get(), get_bind(), get_nested_transaction(), get_transaction(), identity_key(), identity_map, in_nested_transaction(), in_transaction(), info, invalidate(), is_active, is_modified(), merge(), new, no_autoflush, object_session(), prepare(), query(), refresh(), rollback(), scalar(), scalars()
Классная подпись
класс
sqlalchemy.orm.Session
(sqlalchemy.orm.session._SessionClassMethods
,sqlalchemy.event.registry.EventTarget
)-
method
sqlalchemy.orm.Session.
__init__(bind: Optional[_SessionBind] = None, *, autoflush: bool = True, future: Literal[True] = True, expire_on_commit: bool = True, autobegin: bool = True, twophase: bool = False, binds: Optional[Dict[_SessionBindKey, _SessionBind]] = None, enable_baked_queries: bool = True, info: Optional[_InfoType] = None, query_cls: Optional[Type[Query[Any]]] = None, autocommit: Literal[False] = False, join_transaction_mode: JoinTransactionMode = 'conditional_savepoint')¶ Создайте новую сессию.
См. также функцию
sessionmaker
, которая используется для созданияSession
-производящей вызываемой программы с заданным набором аргументов.- Параметры:
autoflush – При
True
все операции запроса будут выполнятьSession.flush()
вызов этогоSession
перед продолжением. Это удобная функция, позволяющая избежать повторного вызоваSession.flush()
для получения результатов запросов к базе данных. … см. также:: Промывка - дополнительная информация об автозапускеautobegin – Автоматически запускать транзакции (т.е. эквивалентно вызову
Session.begin()
), когда доступ к базе данных запрашивается операцией. По умолчанию установлено значениеTrue
. Установите значениеFalse
, чтобы предотвратитьSession
от неявного начала транзакций после построения, а также после вызова любого из методовSession.rollback()
,Session.commit()
илиSession.close()
. … версия добавлена:: 2.0 .. seealso:: Отключение автозапуска для предотвращения неявных транзакцийbind – Необязательный
Engine
илиConnection
, к которому должен быть привязан этотSession
. Если он указан, все SQL-операции, выполняемые этой сессией, будут выполняться через этот подключаемый элемент.binds – Словарь, в котором может быть указано любое количество объектов
Engine
илиConnection
в качестве источника связности для операций SQL на основе каждого объекта. Ключи словаря состоят из любой серии сопоставленных классов, произвольных классов Python, которые являются основой для сопоставленных классов,Table
объектов иMapper
объектов. Значениями словаря являются экземпляры объектовEngine
или режеConnection
. Операции, которые выполняются относительно определенного сопоставленного класса, будут обращаться к этому словарю для поиска ближайшего подходящего объекта, чтобы определить, какойEngine
следует использовать для конкретной операции SQL. Полная эвристика для разрешения описана вSession.get_bind()
. Использование выглядит следующим образом:: Session = sessionmaker(binds={ SomeMappedClass: create_engine(„postgresql+psycopg2://engine1“), SomeDeclarativeBase: create_engine(„postgresql+psycopg2: //engine2“), some_mapper: create_engine(„postgresql+psycopg2://engine3“), some_table: create_engine(„postgresql+psycopg2://engine4“), }) . . см. также:: Стратегии разделения (например, несколько бэкэндов баз данных на сессию)Session.bind_mapper()
Session.bind_table()
Session.get_bind()
class_ – Укажите альтернативный класс, отличный от
sqlalchemy.orm.session.Session
, который должен использоваться возвращаемым классом. Это единственный аргумент, который является локальным для функцииsessionmaker
, и не передается непосредственно в конструктор дляSession
.enable_baked_queries – legacy; по умолчанию
True
. Параметр, используемый расширениемsqlalchemy.ext.baked
для определения того, следует ли кэшировать «запеченные запросы», как обычно работает это расширение. При значенииFalse
кэширование, используемое этим конкретным расширением, отключено. … versionchanged:: 1.4 Расширениеsqlalchemy.ext.baked
является устаревшим и не используется ни одним из внутренних компонентов SQLAlchemy. Поэтому этот флаг влияет только на те приложения, которые явно используют это расширение в своем собственном коде.expire_on_commit – По умолчанию установлено значение
True
. ПриTrue
все экземпляры будут полностью уничтожены после каждогоcommit()
, так что все обращения к атрибутам/объектам после завершенной транзакции будут загружаться из самого последнего состояния базы данных. … см. также:: Совершениеfuture – Исправлено; этот флаг всегда равен True. … см. также:: SQLAlchemy 2.0 - руководство по миграции
info – необязательный словарь произвольных данных, которые должны быть связаны с этим
Session
. Доступен через атрибутSession.info
. Обратите внимание, что словарь копируется во время построения, так что изменения в словаре для каждогоSession
будут локальными для этогоSession
.query_cls – Класс, который должен использоваться для создания новых объектов Query, возвращаемых методом
Session.query()
. По умолчанию используетсяQuery
.twophase – При
True
все транзакции будут запускаться как «двухфазная» транзакция, т.е. с использованием «двухфазной» семантики используемой базы данных вместе с XID. Во время транзакцииcommit()
, после того какflush()
будет выдан для всех подключенных баз данных, будет вызван методTwoPhaseTransaction.prepare()
наTwoPhaseTransaction
каждой базы данных. Это позволяет каждой базе данных откатить всю транзакцию, прежде чем каждая транзакция будет зафиксирована.autocommit – ключевое слово «autocommit» присутствует для обратной совместимости, но должно оставаться в значении по умолчанию
False
.join_transaction_mode – Описывает транзакционное поведение, которое следует предпринять, если данное соединение является
Connection
, которое уже начало транзакцию вне области действия данногоSession
; другими словами, методConnection.in_transaction()
возвращает True. Следующие поведения вступают в силу только тогда, когдаSession
фактически использует данное соединение; то есть фактически вызываются такие методы, какSession.execute()
,Session.connection()
и т.д: *"conditional_savepoint"
- по умолчанию. Если данноеConnection
начато в рамках транзакции, но не имеет SAVEPOINT, то используется"rollback_only"
. ЕслиConnection
дополнительно находится внутри SAVEPOINT, другими словами, методConnection.in_nested_transaction()
возвращает True, то используется"create_savepoint"
. Поведение"conditional_savepoint"
пытается использовать точки сохранения для того, чтобы сохранить состояние существующей транзакции неизменным, но только если уже есть точка сохранения в процессе выполнения; в противном случае не предполагается, что используемый бэкенд имеет адекватную поддержку SAVEPOINT, так как доступность этой функции варьируется."conditional_savepoint"
также стремится установить приблизительную обратную совместимость с предыдущим поведениемSession
для приложений, которые не устанавливают определенный режим. Рекомендуется использовать одну из явных настроек. *"create_savepoint"
-Session
будет использоватьConnection.begin_nested()
во всех случаях для создания собственной транзакции. Эта транзакция по своей природе проходит «поверх» любой существующей транзакции, открытой на данномConnection
; если базовая база данных и используемый драйвер имеют полную, не нарушенную поддержку SAVEPOINT, внешняя транзакция останется незатронутой в течение всего времени жизниSession
. Режим"create_savepoint"
наиболее полезен для интеграцииSession
в набор тестов, где внешняя инициированная транзакция должна оставаться незатронутой; однако он зависит от надлежащей поддержки SAVEPOINT базовым драйвером и базой данных. … совет:: При использовании SQLite драйвер SQLite, включенный в Python 3.11, не во всех случаях корректно обрабатывает SAVEPOINT без обходных путей. Смотрите раздел Сериализуемая изоляция / Точки сохранения / Транзакционный DDL для получения подробной информации о текущих обходных путях. *"control_fully"
-Session
возьмет под контроль данную транзакцию как свою собственную;Session.commit()
вызовет.commit()
на транзакции,Session.rollback()
вызовет.rollback()
на транзакции,Session.close()
вызовет.rollback
на транзакции. … совет:: Этот режим использования эквивалентен тому, как SQLAlchemy 1.4 будет обрабатыватьConnection
, переданный с существующим SAVEPOINT (т.е.Connection.begin_nested()
);Session
будет полностью контролировать существующий SAVEPOINT. *"rollback_only"
-Session
возьмет под контроль данную транзакцию только для вызовов.rollback()
; вызовы.commit()
не будут распространяться на данную транзакцию. Вызовы.close()
не будут иметь никакого эффекта на данную транзакцию. … совет:: Этот режим использования эквивалентен тому, как SQLAlchemy 1.4 будет обрабатыватьConnection
, переданный с существующей обычной транзакцией базы данных (т.е.Connection.begin()
);Session
будет распространятьSession.rollback()
вызовыSession.commit()
на базовуюSession.close()
транзакцию,
-
method
sqlalchemy.orm.Session.
add(instance: object, _warn: bool = True) None ¶ Поместите объект в этот
Session
.Объекты, находящиеся в состоянии transient при передаче в метод
Session.add()
, перейдут в состояние pending до следующей промывки, после которой они перейдут в состояние persistent.Объекты, которые находятся в состоянии detached при передаче в метод
Session.add()
, перейдут в состояние persistent напрямую.Если транзакция, используемая
Session
, откатывается, объекты, которые были переходными, когда они были переданы вSession.add()
, будут переведены обратно в состояние transient и больше не будут присутствовать в этомSession
.
-
method
sqlalchemy.orm.Session.
add_all(instances: Iterable[object]) None ¶ Добавляет заданную коллекцию экземпляров к данному
Session
.Общее описание поведения см. в документации для
Session.add()
.
-
method
sqlalchemy.orm.Session.
begin(nested: bool = False) SessionTransaction ¶ Начать транзакцию или вложенную транзакцию на этом
Session
, если она еще не начата.Объект
Session
имеет поведение autobegin, поэтому обычно нет необходимости в явном вызове методаSession.begin()
. Однако его можно использовать для того, чтобы контролировать область, в которой начинается транзакционное состояние.При использовании для начала самой внешней транзакции возникает ошибка, если эта
Session
уже находится внутри транзакции.- Параметры:
nested – если True, начинает транзакцию SAVEPOINT и эквивалентна вызову
Session.begin_nested()
. Документацию по транзакциям SAVEPOINT смотрите в разделе Использование SAVEPOINT.- Результат:
объект
SessionTransaction
. Обратите внимание, чтоSessionTransaction
действует как менеджер контекста Python, позволяя использоватьSession.begin()
в блоке «with». Смотрите пример Явное начало.
-
method
sqlalchemy.orm.Session.
begin_nested() SessionTransaction ¶ Начните «вложенную» транзакцию на этой сессии, например, SAVEPOINT.
Для правильной работы этого метода целевая база данных (базы данных) и соответствующие драйверы должны поддерживать SQL SAVEPOINT.
Документацию по транзакциям SAVEPOINT см. в разделе Использование SAVEPOINT.
- Результат:
объект
SessionTransaction
. Обратите внимание, чтоSessionTransaction
действует как менеджер контекста, позволяя использоватьSession.begin_nested()
в блоке «with». Пример использования см. в Использование SAVEPOINT.
См.также
Сериализуемая изоляция / Точки сохранения / Транзакционный DDL - специальные обходные пути, необходимые для работы драйвера SQLite, чтобы SAVEPOINT работал правильно.
-
method
sqlalchemy.orm.Session.
bind_mapper(mapper: _EntityBindKey[_O], bind: _SessionBind) None ¶ Ассоциируйте
Mapper
или произвольный класс Python с «привязкой», например,Engine
илиConnection
.Данная сущность добавляется в поиск, используемый методом
Session.get_bind()
.- Параметры:
mapper – объект
Mapper
, или экземпляр сопоставленного класса, или любой класс Python, который является основой набора сопоставленных классов.bind – объект
Engine
илиConnection
.
-
method
sqlalchemy.orm.Session.
bind_table(table: TableClause, bind: Union[Engine, Connection]) None ¶ Соедините
Table
с «привязкой», например,Engine
илиConnection
.Заданный
Table
добавляется в поиск, используемый методомSession.get_bind()
.- Параметры:
table – объект
Table
, который обычно является целью отображения ORM, или присутствует внутри selectable, который отображается.bind – объект
Engine
илиConnection
.
-
method
sqlalchemy.orm.Session.
bulk_insert_mappings(mapper: Mapper[Any], mappings: Iterable[Dict[str, Any]], return_defaults: bool = False, render_nulls: bool = False) None ¶ Выполните массовую вставку заданного списка картографических словарей.
Legacy Feature
Этот метод является унаследованной функцией, начиная с версии 2.0 серии SQLAlchemy. О современных массовых INSERT и UPDATE см. разделы ORM Bulk INSERT Statements и ORM Bulk UPDATE по первичному ключу. API версии 2.0 разделяет детали реализации с этим методом и добавляет новые возможности.
- Параметры:
mapper – сопоставленный класс или реальный объект
Mapper
, представляющий единственный вид объекта, представленный в списке сопоставления.mappings – последовательность словарей, каждый из которых содержит состояние вставляемой строки отображения в терминах имен атрибутов отображаемого класса. Если отображение ссылается на несколько таблиц, например, отображение с объединенным наследованием, каждый словарь должен содержать все ключи, которые должны быть заполнены во всех таблицах.
return_defaults – при значении True процесс INSERT будет изменен таким образом, чтобы обеспечить получение вновь созданных значений первичного ключа. Этот параметр обычно используется для того, чтобы обеспечить массовую вставку сопоставлений Joined Table Inheritance. … Примечание:: для бэкендов, не поддерживающих RETURNING, параметр
Session.bulk_insert_mappings.return_defaults
может значительно снизить производительность, поскольку операторы INSERT больше не могут быть объединены в пакет. Смотрите Поведение «Вставка многих значений» для операторов INSERT для получения информации о том, какие бэкенды затронуты.render_nulls – Если значение
None
равно True, то в оператор INSERT будет включено значение NULL, а не столбец будет опущен в INSERT. Это позволяет всем вводимым строкам иметь одинаковый набор столбцов, что позволяет передавать полный набор строк в DBAPI. Обычно каждый набор столбцов, содержащий другую комбинацию значений NULL, чем предыдущий ряд, должен опускать другую серию столбцов из оператора INSERT, что означает, что он должен быть выдан как отдельный оператор. Передача этого флага гарантирует, что весь набор строк можно объединить в один пакет; однако ценой этого является то, что серверные настройки по умолчанию, которые вызываются опущенным столбцом, будут пропущены, поэтому следует позаботиться о том, чтобы в них не было необходимости. … предупреждение:: Когда этот флаг установлен, значения SQL по умолчанию на стороне сервера не будут вызываться для тех столбцов, которые вставлены как NULL; значение NULL будет отправлено явно. Необходимо позаботиться о том, чтобы для операции в целом не требовалось вызывать серверные функции по умолчанию.
-
method
sqlalchemy.orm.Session.
bulk_save_objects(objects: Iterable[object], return_defaults: bool = False, update_changed_only: bool = True, preserve_order: bool = True) None ¶ Выполните массовое сохранение заданного списка объектов.
Legacy Feature
Этот метод является унаследованной функцией, начиная с версии 2.0 серии SQLAlchemy. О современных массовых INSERT и UPDATE см. разделы ORM Bulk INSERT Statements и ORM Bulk UPDATE по первичному ключу.
Для общего INSERT и UPDATE существующих объектов, отображаемых ORM, предпочитайте стандартные паттерны управления данными unit of work, представленные в Унифицированный учебник по SQLAlchemy в Манипулирование данными с помощью ORM. SQLAlchemy 2.0 теперь использует Поведение «Вставка многих значений» для операторов INSERT с современными диалектами, что решает предыдущие проблемы медлительности массового INSERT.
- Параметры:
objects – последовательность сопоставленных экземпляров объектов. Сопоставленные объекты сохраняются как есть и не ассоциируются с
Session
впоследствии. Для каждого объекта, будет ли он отправлен как INSERT или UPDATE, зависит от тех же правил, которые используютсяSession
в традиционной операции; если у объекта установлен атрибутInstanceState.key
, то предполагается, что объект «отсоединен» и в результате будет UPDATE. В противном случае используется INSERT. В случае UPDATE утверждения группируются на основе того, какие атрибуты изменились, и, следовательно, должны быть предметом каждого предложения SET. Еслиupdate_changed_only
имеет значение False, то все атрибуты, присутствующие в каждом объекте, применяются к оператору UPDATE, что может помочь в группировке операторов в более крупный executemany(), а также уменьшит накладные расходы на проверку истории атрибутов.return_defaults – при значении True строки, в которых отсутствуют значения, генерирующие значения по умолчанию, а именно целочисленные первичные ключи по умолчанию и последовательности, будут вставляться по одному, чтобы значение первичного ключа было доступно. В частности, это позволит корректно вставлять объединенное наследование и другие многотабличные отображения без необходимости предоставлять значения первичного ключа заранее; однако
Session.bulk_save_objects.return_defaults
значительно снижает прирост производительности метода в целом. Настоятельно рекомендуется использовать стандартный подходSession.add_all()
.update_changed_only – При значении True операторы UPDATE отображаются на основе тех атрибутов в каждом состоянии, которые зарегистрировали изменения. При значении False все присутствующие атрибуты отображаются в предложение SET, за исключением атрибутов первичного ключа.
preserve_order – когда True, порядок вставок и обновлений точно соответствует порядку, в котором заданы объекты. Когда False, общие типы объектов группируются по вставкам и обновлениям, чтобы обеспечить больше возможностей для пакетной обработки.
-
method
sqlalchemy.orm.Session.
bulk_update_mappings(mapper: Mapper[Any], mappings: Iterable[Dict[str, Any]]) None ¶ Выполните массовое обновление заданного списка картографических словарей.
Legacy Feature
Этот метод является унаследованной функцией, начиная с версии 2.0 серии SQLAlchemy. О современных массовых INSERT и UPDATE см. разделы ORM Bulk INSERT Statements и ORM Bulk UPDATE по первичному ключу. API версии 2.0 разделяет детали реализации с этим методом и добавляет новые возможности.
- Параметры:
mapper – сопоставленный класс или реальный объект
Mapper
, представляющий единственный вид объекта, представленный в списке сопоставления.mappings – последовательность словарей, каждый из которых содержит состояние сопоставленной строки, подлежащей обновлению, в терминах имен атрибутов сопоставленного класса. Если отображение относится к нескольким таблицам, например, отображение с объединенным наследованием, каждый словарь может содержать ключи, соответствующие всем таблицам. Все ключи, которые присутствуют и не являются частью первичного ключа, применяются к пункту SET оператора UPDATE; значения первичного ключа, которые требуются, применяются к пункту WHERE.
-
method
sqlalchemy.orm.Session.
close() None ¶ Закройте транзакционные ресурсы и объекты ORM, используемые этой
Session
.Это удаляет все объекты ORM, связанные с данным
Session
, завершает любую выполняющуюся транзакцию и releases любыеConnection
объекты, которые данныйSession
сам выписал из связанныхEngine
объектов. Операция оставляетSession
в состоянии, в котором он может быть использован снова.Совет
Метод
Session.close()
не препятствует повторному использованию сессии. СамSession
на самом деле не имеет отдельного состояния «закрыто»; это просто означает, чтоSession
освободит все соединения с базой данных и объекты ORM.Изменено в версии 1.4: Метод
Session.close()
не создает сразу новый объектSessionTransaction
; вместо этого новыйSessionTransaction
создается только в том случае, еслиSession
снова используется для операции с базой данных.См.также
Закрытие - подробно о семантике
Session.close()
-
classmethod
sqlalchemy.orm.Session.
close_all() None ¶ наследуется от
sqlalchemy.orm.session._SessionClassMethods.close_all
методаsqlalchemy.orm.session._SessionClassMethods
Закройте все сессии в памяти.
Не рекомендуется, начиная с версии 1.3: Метод
Session.close_all()
является устаревшим и будет удален в одном из будущих выпусков. Пожалуйста, обратитесь кclose_all_sessions()
.
-
method
sqlalchemy.orm.Session.
commit() None ¶ Очистка ожидающих изменений и фиксация текущей транзакции.
Когда операция COMMIT завершена, все объекты полностью expired, стирается их внутреннее содержимое, которое будет автоматически загружено заново при следующем обращении к объектам. В промежуточный момент эти объекты находятся в просроченном состоянии и не будут функционировать, если к ним detached из
Session
. Кроме того, эта операция повторной загрузки не поддерживается при использовании асинхронно-ориентированных API. ПараметрSession.expire_on_commit
может быть использован для отключения этого поведения.Если для
Session
не существует транзакции, указывающей на то, что с момента предыдущего вызоваSession.commit()
для этогоSession
не было вызвано никаких операций, метод начнет и зафиксирует только внутреннюю «логическую» транзакцию, которая обычно не влияет на базу данных, если только не были обнаружены ожидающие изменения флеша, но все равно вызовет обработчики событий и правила истечения срока действия объектов.Внешняя транзакция базы данных фиксируется безусловно, автоматически освобождая все действующие SAVEPOINT.
-
method
sqlalchemy.orm.Session.
connection(bind_arguments: Optional[_BindArguments] = None, execution_options: Optional[_ExecuteOptions] = None) Connection ¶ Возвращает объект
Connection
, соответствующий транзакционному состоянию этого объектаSession
.Возвращается либо
Connection
, соответствующий текущей транзакции, либо, если транзакция не выполняется, начинается новая и возвращаетсяConnection
(обратите внимание, что транзакционное состояние не устанавливается с DBAPI до тех пор, пока не будет выдан первый SQL-оператор).Неоднозначность в многосвязных или несвязанных объектах
Session
может быть разрешена с помощью любого из необязательных аргументов ключевого слова. В конечном итоге для разрешения используется методget_bind()
.- Параметры:
bind_arguments – словарь аргументов связывания. Может включать «mapper», «bind», «clause», другие пользовательские аргументы, которые передаются в
Session.get_bind()
.execution_options – словарь параметров выполнения, которые будут переданы в
Connection.execution_options()
, только при первом получении соединения. Если соединение уже присутствует вSession
, выдается предупреждение и аргументы игнорируются. … см. также:: Настройка уровней изоляции транзакций / DBAPI AUTOCOMMIT
-
method
sqlalchemy.orm.Session.
delete(instance: object) None ¶ Пометить экземпляр как удаленный.
При передаче предполагается, что объект находится в состоянии persistent или detached; после вызова метода объект будет находиться в состоянии persistent до следующей процедуры flush. В течение этого времени объект также будет членом коллекции
Session.deleted
.Когда произойдет следующий flush, объект перейдет в состояние deleted, указывающее на то, что для его строки в текущей транзакции был выпущен оператор
DELETE
. Когда транзакция успешно зафиксирована, удаленный объект переходит в состояние detached и больше не присутствует в этомSession
.См.также
-
attribute
sqlalchemy.orm.Session.
deleted¶ Набор всех экземпляров, помеченных как «удаленные» в пределах данного
Session
.
-
attribute
sqlalchemy.orm.Session.
dirty¶ Множество всех постоянных экземпляров, которые считаются грязными.
Например:
some_mapped_object in session.dirty
Экземпляры считаются грязными, если они были изменены, но не удалены.
Обратите внимание, что этот «грязный» расчет является «оптимистичным»; большинство операций по установке атрибутов или изменению коллекции пометит экземпляр как «грязный» и поместит его в этот набор, даже если нет чистого изменения значения атрибута. Во время промывки значение каждого атрибута сравнивается с его ранее сохраненным значением, и если чистого изменения нет, операция SQL не выполняется (это более дорогая операция, поэтому она выполняется только во время промывки).
Чтобы проверить, есть ли у экземпляра действующие чистые изменения его атрибутов, используйте метод
Session.is_modified()
.
-
method
sqlalchemy.orm.Session.
enable_relationship_loading(obj: object) None ¶ Связывает объект с этим
Session
для загрузки связанного объекта.Предупреждение
enable_relationship_loading()
существует для специальных случаев использования и не рекомендуется для общего использования.Доступ к атрибутам, сопоставленным с
relationship()
, будет пытаться загрузить значение из базы данных, используя этотSession
в качестве источника связи. Значения будут загружаться на основе значений внешнего и первичного ключей, имеющихся у данного объекта - если они отсутствуют, то эти связи будут недоступны.Объект будет присоединен к этой сессии, но не будет участвовать в каких-либо операциях сохранения; его состояние почти для всех целей будет оставаться либо «переходным», либо «отсоединенным», за исключением случаев загрузки отношений.
Также обратите внимание, что обратные ссылки часто работают не так, как ожидается. Изменение атрибута, связанного с отношениями, на целевом объекте может не вызвать событие обратной ссылки, если эффективное значение уже было загружено из значения, удерживаемого посторонним ключом.
Метод
Session.enable_relationship_loading()
аналогичен флагуload_on_pending
вrelationship()
. В отличие от этого флага,Session.enable_relationship_loading()
позволяет объекту оставаться переходным, сохраняя возможность загружать связанные элементы.Чтобы сделать переходный объект, связанный с
Session
черезSession.enable_relationship_loading()
отложенным, добавьте его кSession
с помощьюSession.add()
обычным способом. Если объект вместо этого представляет существующую личность в базе данных, его следует объединить с помощьюSession.merge()
.Session.enable_relationship_loading()
не улучшает поведение при обычном использовании ORM - объектные ссылки должны быть построены на уровне объекта, а не на уровне внешнего ключа, чтобы они присутствовали обычным образом до выполнения flush(). Этот метод не предназначен для общего использования.См.также
relationship.load_on_pending
- этот флаг разрешает загрузку «многие-к-одному» для элементов, которые находятся в ожидании.make_transient_to_detached()
- позволяет добавить объект вSession
без использования SQL, который затем будет раскрывать атрибуты при доступе.
-
method
sqlalchemy.orm.Session.
execute(statement: Executable, params: Optional[_CoreAnyExecuteParams] = None, *, execution_options: OrmExecuteOptionsParameter = {}, bind_arguments: Optional[_BindArguments] = None, _parent_execute_state: Optional[Any] = None, _add_event: Optional[Any] = None) Result[Any] ¶ Выполнение конструкции выражения SQL.
Возвращает объект
Result
, представляющий результаты выполнения оператора.Например:
from sqlalchemy import select result = session.execute( select(User).where(User.id == 5) )
API-контракт
Session.execute()
аналогичен контрактуConnection.execute()
, 2.0 style версииConnection
.Изменено в версии 1.4: метод
Session.execute()
теперь является основной точкой выполнения операторов ORM при использовании 2.0 style ORM.- Параметры:
statement – Исполняемый оператор (т.е. выражение
Executable
, напримерselect()
).params – Необязательный словарь или список словарей, содержащих значения связанных параметров. Если словарь один, то происходит выполнение одной строки; если список словарей, то будет вызван «executemany». Ключи в каждом словаре должны соответствовать именам параметров, присутствующих в операторе.
execution_options – необязательный словарь опций выполнения, которые будут связаны с выполнением оператора. Этот словарь может предоставлять подмножество опций, которые принимаются
Connection.execution_options()
, а также может предоставлять дополнительные опции, понятные только в контексте ORM. … seealso:: Варианты выполнения ORM - специфические для ORM параметры выполненияbind_arguments – словарь дополнительных аргументов для определения привязки. Может включать «mapper», «bind» или другие пользовательские аргументы. Содержимое этого словаря передается в метод
Session.get_bind()
.
- Результат:
объект
Result
.
-
method
sqlalchemy.orm.Session.
expire(instance: object, attribute_names: Optional[Iterable[str]] = None) None ¶ Истечение срока действия атрибутов экземпляра.
Помечает атрибуты экземпляра как устаревшие. При следующем обращении к просроченному атрибуту будет выдан запрос к текущему транзакционному контексту объекта
Session
, чтобы загрузить все просроченные атрибуты для данного экземпляра. Обратите внимание, что высоко изолированная транзакция вернет те же значения, которые были ранее прочитаны в этой же транзакции, независимо от изменений в состоянии базы данных вне этой транзакции.Чтобы одновременно исключить все объекты в
Session
, используйтеSession.expire_all()
.Поведение объекта
Session
по умолчанию заключается в том, что при вызове методовSession.rollback()
илиSession.commit()
все состояние истекает, так что новое состояние может быть загружено для новой транзакции. По этой причине вызов методаSession.expire()
имеет смысл только в том случае, если в текущей транзакции был выдан нестандартный SQL-запрос.- Параметры:
instance – Экземпляр, который необходимо обновить.
attribute_names – необязательный список строковых имен атрибутов, указывающих на подмножество атрибутов, срок действия которых истекает.
См.также
Обновление / истечение срока действия - вводный материал
-
method
sqlalchemy.orm.Session.
expire_all() None ¶ Истечение срока действия всех постоянных экземпляров в рамках этой сессии.
При следующем обращении к любым атрибутам постоянного экземпляра будет выдан запрос с использованием текущего транзакционного контекста объекта
Session
, чтобы загрузить все истекшие атрибуты для данного экземпляра. Заметим, что высоко изолированная транзакция вернет те же значения, которые были ранее прочитаны в этой же транзакции, независимо от изменений в состоянии базы данных вне этой транзакции.Чтобы исключить отдельные объекты и отдельные атрибуты этих объектов, используйте
Session.expire()
.Поведение объекта
Session
по умолчанию заключается в том, что при вызове методовSession.rollback()
илиSession.commit()
все состояние истекает, чтобы новое состояние могло быть загружено для новой транзакции. По этой причине вызовSession.expire_all()
обычно не требуется, если транзакция изолирована.См.также
Обновление / истечение срока действия - вводный материал
-
method
sqlalchemy.orm.Session.
expunge(instance: object) None ¶ Удалите instance из этого
Session
.Это освободит все внутренние ссылки на экземпляр. Каскадирование будет применяться в соответствии с правилом каскада expunge.
-
method
sqlalchemy.orm.Session.
expunge_all() None ¶ Удалить все экземпляры объектов из данного
Session
.Это эквивалентно вызову
expunge(obj)
на всех объектах в этомSession
.
-
method
sqlalchemy.orm.Session.
flush(objects: Optional[Sequence[Any]] = None) None ¶ Сбросьте все изменения объекта в базу данных.
Записывает все ожидающие создания, удаления и модификации объектов в базу данных в виде INSERTs, DELETEs, UPDATEs и т.д. Операции автоматически упорядочиваются решателем зависимостей единицы работы сессии.
Операции с базой данных будут выполняться в текущем транзакционном контексте и не влияют на состояние транзакции, если только не произойдет ошибка, в этом случае вся транзакция будет откачена. Вы можете выполнять flush() так часто, как вам нравится в рамках транзакции, чтобы перенести изменения из Python в буфер транзакции базы данных.
- Параметры:
objects – Необязательно; ограничивает операцию flush только элементами, которые находятся в данной коллекции. Эта функция предназначена для очень узкого круга случаев, когда конкретные объекты могут быть обработаны до того, как произойдет полная операция flush(). Она не предназначена для общего использования.
-
method
sqlalchemy.orm.Session.
get(entity: _EntityBindKey[_O], ident: _PKIdentityArgument, *, options: Optional[Sequence[ORMOption]] = None, populate_existing: bool = False, with_for_update: ForUpdateParameter = None, identity_token: Optional[Any] = None, execution_options: OrmExecuteOptionsParameter = {}, bind_arguments: Optional[_BindArguments] = None) Optional[_O] ¶ Возвращает экземпляр, основанный на заданном идентификаторе первичного ключа, или
None
, если он не найден.Например:
my_user = session.get(User, 5) some_object = session.get(VersionedFoo, (5, 10)) some_object = session.get( VersionedFoo, {"id": 5, "version_id": 10} )
Добавлено в версии 1.4: Добавлен метод
Session.get()
, который перенесен из устаревшего методаQuery.get()
.Session.get()
является особенным, так как предоставляет прямой доступ к карте идентификацииSession
. Если заданный идентификатор первичного ключа присутствует в локальной карте идентификации, объект возвращается непосредственно из этой коллекции и никакого SQL не выдается, если только объект не был помечен как полностью истекший. Если объект не присутствует, выполняется SELECT для поиска объекта.Session.get()
также выполнит проверку, если объект присутствует в карте идентификации и помечен как просроченный - будет выдан SELECT, чтобы обновить объект, а также убедиться, что строка все еще присутствует. Если нет, то выдается сообщениеObjectDeletedError
.- Параметры:
entity – сопоставленный класс или
Mapper
, указывающий на тип загружаемой сущности.ident – Скаляр, кортеж или словарь, представляющий первичный ключ. Для составного (например, с несколькими столбцами) первичного ключа следует передавать кортеж или словарь. Для первичного ключа, состоящего из одного столбца, обычно наиболее удобна скалярная форма вызова. Если первичным ключом строки является значение «5», вызов выглядит так:: my_object = session.get(SomeClass, 5) Форма кортежа содержит значения первичного ключа обычно в том порядке, в котором они соответствуют столбцам первичного ключа сопоставленного объекта
Table
, или, если используется параметр конфигурацииMapper.primary_key
, в порядке, используемом для этого параметра. Например, если первичный ключ строки представлен целыми цифрами «5, 10», вызов будет выглядеть так:: my_object = session.get(SomeClass, (5, 10)) Словарная форма должна включать в качестве ключей имена сопоставленных атрибутов, соответствующих каждому элементу первичного ключа. Если сопоставленный класс имеет атрибутыid
,version_id
в качестве атрибутов, которые хранят значение первичного ключа объекта, вызов будет выглядеть так:: my_object = session.get(SomeClass, {«id»: 5, «version_id»: 10})options – необязательная последовательность опций загрузчика, которые будут применены к запросу, если он выдан.
populate_existing – заставляет метод безусловно выдать SQL-запрос и обновить объект новыми загруженными данными, независимо от того, существует ли уже объект.
with_for_update – необязательное булево
True
, указывающее, что должен использоваться FOR UPDATE, или может быть словарем, содержащим флаги для указания более конкретного набора флагов FOR UPDATE для SELECT; флаги должны соответствовать параметрамQuery.with_for_update()
. Заменяет параметрSession.refresh.lockmode
.execution_options – необязательный словарь опций выполнения, которые будут ассоциированы с выполнением запроса, если он будет выдан. Этот словарь может содержать подмножество опций, принимаемых
Connection.execution_options()
, а также может содержать дополнительные опции, понятные только в контексте ORM. … версия добавлена:: 1.4.29 .. seealso:: Варианты выполнения ORM - специфические для ORM параметры выполненияbind_arguments – словарь дополнительных аргументов для определения привязки. Может включать «mapper», «bind» или другие пользовательские аргументы. Содержимое этого словаря передается в метод
Session.get_bind()
. … добавлена версия: 2.0.0rc1
- Результат:
Экземпляр объекта, или
None
.
-
method
sqlalchemy.orm.Session.
get_bind(mapper: Optional[_EntityBindKey[_O]] = None, *, clause: Optional[ClauseElement] = None, bind: Optional[_SessionBind] = None, _sa_skip_events: Optional[bool] = None, _sa_skip_for_implicit_returning: bool = False, **kw: Any) Union[Engine, Connection] ¶ Возвращает «привязку», к которой привязан данный
Session
.Связка» обычно является экземпляром
Engine
, за исключением случаев, когдаSession
был явно связан непосредственно сConnection
.Для многократно связанного или несвязанного
Session
аргументыmapper
илиclause
используются для определения соответствующего связывания для возврата.Обратите внимание, что аргумент «mapper» обычно присутствует, когда
Session.get_bind()
вызывается через операцию ORM, такую какSession.query()
, каждая отдельная операция INSERT/UPDATE/DELETE в рамкахSession.flush()
, вызов и т.д.Порядок разрешения следующий:
если задан mapper и присутствует
Session.binds
, найти привязку, основываясь сначала на используемом mapper, затем на используемом mapped class, затем на любых базовых классах, присутствующих в__mro__
отображаемого класса, от более специфических суперклассов к более общим.если пункт задан и присутствует
Session.binds
, найти привязку на основе объектовTable
, найденных в данном пункте, присутствующих вSession.binds
.если
Session.binds
присутствует, верните его.если дано предложение, попытаться вернуть привязку, связанную с
MetaData
, в конечном итоге связанную с предложением.если задан mapper, попытаться вернуть привязку, связанную с
MetaData
, в конечном итоге ассоциированную сTable
или другим selectable, с которым сопоставлен mapper.Связка не найдена, выдается сообщение
UnboundExecutionError
.
Обратите внимание, что метод
Session.get_bind()
может быть переопределен в определяемом пользователем подклассеSession
для обеспечения любой схемы разрешения привязки. Смотрите пример в Нестандартные вертикальные перегородки.- Параметры:
mapper – Необязательный сопоставленный класс или соответствующий экземпляр
Mapper
. Привязка может быть получена изMapper
, во-первых, путем обращения к карте «привязок», связанной с этимSession
, и, во-вторых, путем обращения кMetaData
, связанной сTable
, к которому привязываетсяMapper
для привязки.clause –
ClauseElement
(т.е.select()
,text()
и т.д.). Если аргументmapper
отсутствует или не смог создать связывание, то в данной конструкции выражения будет произведен поиск связанного элемента, обычноTable
, связанного со связаннымMetaData
.
-
method
sqlalchemy.orm.Session.
get_nested_transaction() Optional[SessionTransaction] ¶ Возвращает текущую выполняющуюся вложенную транзакцию, если таковая имеется.
Добавлено в версии 1.4.
-
method
sqlalchemy.orm.Session.
get_transaction() Optional[SessionTransaction] ¶ Возвращает текущую выполняющуюся корневую транзакцию, если таковая имеется.
Добавлено в версии 1.4.
-
classmethod
sqlalchemy.orm.Session.
identity_key(class_: Optional[Type[Any]] = None, ident: Union[Any, Tuple[Any, ...]] = None, *, instance: Optional[Any] = None, row: Optional[Union[Row[Any], RowMapping]] = None, identity_token: Optional[Any] = None) _IdentityKeyType[Any] ¶ наследуется от
sqlalchemy.orm.session._SessionClassMethods.identity_key
методаsqlalchemy.orm.session._SessionClassMethods
Возвращает ключ идентификации.
Это псевдоним
identity_key()
.
-
attribute
sqlalchemy.orm.Session.
identity_map: IdentityMap¶ Отображение идентификаторов объектов на сами объекты.
Итерация через
Session.identity_map.values()
обеспечивает доступ к полному набору постоянных объектов (т.е. тех, которые имеют идентификатор строки), находящихся в данный момент в сессии.См.также
identity_key()
- вспомогательная функция для получения ключей, используемых в данном словаре.
-
method
sqlalchemy.orm.Session.
in_nested_transaction() bool ¶ Возвращает True, если эта
Session
начала вложенную транзакцию, например, SAVEPOINT.Добавлено в версии 1.4.
-
method
sqlalchemy.orm.Session.
in_transaction() bool ¶ Возвращает True, если данная
Session
начала транзакцию.Добавлено в версии 1.4.
См.также
-
attribute
sqlalchemy.orm.Session.
info¶ Модифицируемый пользователем словарь.
Начальное значение этого словаря может быть заполнено с помощью аргумента
info
конструктораSession
, конструктораsessionmaker
или методов фабрики. Данный словарь всегда локален для данногоSession
и может быть изменен независимо от всех другихSession
объектов.
-
method
sqlalchemy.orm.Session.
invalidate() None ¶ Закройте эту сессию, используя аннулирование соединения.
Это вариант
Session.close()
, который дополнительно гарантирует, что методConnection.invalidate()
будет вызван на каждом объектеConnection
, который в данный момент используется для транзакции (обычно существует только одно соединение, еслиSession
не используется с несколькими движками).Это может быть вызвано, когда известно, что база данных находится в состоянии, когда соединения больше не безопасны для использования.
Ниже показан сценарий использования gevent, при котором могут возникать исключения
Timeout
, означающие, что базовое соединение должно быть отброшено:import gevent try: sess = Session() sess.add(User()) sess.commit() except gevent.Timeout: sess.invalidate() raise except: sess.rollback() raise
Метод дополнительно делает все то, что делает
Session.close()
, включая удаление всех объектов ORM.
-
attribute
sqlalchemy.orm.Session.
is_active¶ True, если данный
Session
не находится в состоянии «частичного отката».Изменено в версии 1.4:
Session
больше не начинает новую транзакцию немедленно, поэтому при первом созданииSession
этот атрибут будет иметь значение False.Состояние «частичный откат» обычно указывает на то, что процесс промывки
Session
завершился неудачно, и для полного отката транзакции необходимо вызвать методSession.rollback()
.Если эта
Session
вообще не находится в транзакции,Session
будет автозапускаться при ее первом использовании, поэтому в этом случаеSession.is_active
вернет True.В противном случае, если эта
Session
находится внутри транзакции, и эта транзакция не была откачена внутренне,Session.is_active
также вернет True.
-
method
sqlalchemy.orm.Session.
is_modified(instance: object, include_collections: bool = True) bool ¶ Возвращает
True
, если данный экземпляр имеет локально измененные атрибуты.Этот метод извлекает историю для каждого инструментального атрибута экземпляра и выполняет сравнение текущего значения с его ранее зафиксированным значением, если таковое имеется.
По сути, это более дорогая и точная версия проверки наличия данного экземпляра в коллекции
Session.dirty
; выполняется полная проверка на чистый «грязный» статус каждого атрибута.Например:
return session.is_modified(someobject)
У этого метода есть несколько предостережений:
Экземпляры, находящиеся в коллекции
Session.dirty
, могут сообщитьFalse
при проверке этим методом. Это связано с тем, что объект мог получить события изменения через мутацию атрибутов, в результате чего он оказался вSession.dirty
, но в конечном итоге его состояние осталось тем же, что и при загрузке из базы данных, поэтому чистых изменений здесь нет.Скалярные атрибуты могут не записать ранее установленное значение, когда было применено новое значение, если атрибут не был загружен или был просрочен на момент получения нового значения - в этих случаях предполагается, что атрибут изменился, даже если в конечном итоге нет чистого изменения относительно его значения в базе данных. SQLAlchemy в большинстве случаев не нуждается в «старом» значении, когда происходит событие set, поэтому он пропускает затраты на вызов SQL, если старое значение не присутствует, исходя из предположения, что UPDATE скалярного значения обычно необходим, а в тех немногих случаях, когда это не так, в среднем дешевле, чем выдача защитного SELECT.
Старое» значение извлекается безусловно при установке, только если в контейнере атрибута установлен флаг
active_history
, равныйTrue
. Этот флаг обычно устанавливается для атрибутов первичного ключа и скалярных ссылок на объекты, которые не являются простыми «многие к одному». Чтобы установить этот флаг для любого произвольного сопоставленного столбца, используйте аргументactive_history
сcolumn_property()
.
- Параметры:
instance – сопоставленный экземпляр, который должен быть проверен на наличие предстоящих изменений.
include_collections – Указывает, следует ли включать в операцию многозначные коллекции. Установка этого значения в
False
позволяет определить только свойства, основанные на локальных столбцах (т.е. скалярные столбцы или внешние ключи типа «многие к одному»), которые приведут к UPDATE для данного экземпляра при промывке.
-
method
sqlalchemy.orm.Session.
merge(instance: _O, *, load: bool = True, options: Optional[Sequence[ORMOption]] = None) _O ¶ Скопировать состояние данного экземпляра в соответствующий экземпляр внутри данного
Session
.Session.merge()
изучает атрибуты первичного ключа исходного экземпляра и пытается сверить его с экземпляром с таким же первичным ключом в сессии. Если он не найден локально, делается попытка загрузить объект из базы данных на основе первичного ключа, а если таковой не найден, создается новый экземпляр. Состояние каждого атрибута исходного экземпляра затем копируется в целевой экземпляр. Полученный целевой экземпляр возвращается методом; исходный экземпляр остается неизменным и не связывается сSession
, если он еще не был связан с ним.Эта операция каскадируется на ассоциированные экземпляры, если ассоциация отображена с помощью
cascade="merge"
.Подробное обсуждение слияния см. в Объединение.
- Параметры:
instance – Экземпляр, подлежащий объединению.
load – Булево, при значении False
merge()
переходит в режим «высокой производительности», что заставляет его отказаться от эмиссии событий истории, а также от всех обращений к базе данных. Этот флаг используется в таких случаях, как передача графов объектов вSession
из кэша второго уровня или передача только что загруженных объектов вSession
, принадлежащий рабочему потоку или процессу, без повторного запроса к базе данных. В случае использованияload=False
добавляется оговорка, что данный объект должен находиться в «чистом» состоянии, то есть не иметь ожидающих изменений, подлежащих смыву - даже если входящий объект отделен от какого-либоSession
. Это делается для того, чтобы при операции слияния, когда локальные атрибуты заполняются и каскадируются на связанные объекты и коллекции, значения могли быть «впечатаны» в целевой объект как есть, без генерации каких-либо событий истории или атрибутов, и без необходимости согласования входящих данных с существующими связанными объектами или коллекциями, которые могут быть не загружены. Результирующие объекты изload=False
всегда получаются «чистыми», поэтому вполне уместно, что и передаваемые объекты должны быть «чистыми», иначе это говорит о неправильном использовании метода.options – необязательная последовательность опций загрузчика, которая будет применена к методу
Session.get()
при загрузке операцией слияния существующей версии объекта из базы данных. … versionadded:: 1.4.24
См.также
make_transient_to_detached()
- предусматривает альтернативное средство «слияния» отдельного объекта вSession
.
-
attribute
sqlalchemy.orm.Session.
new¶ Набор всех экземпляров, помеченных как «новые» в пределах данного
Session
.
-
attribute
sqlalchemy.orm.Session.
no_autoflush¶ Возвращает менеджер контекста, который отключает автосмыв.
например:
with session.no_autoflush: some_object = SomeClass() session.add(some_object) # won't autoflush some_object.related_thing = session.query(SomeRelated).first()
Операции, выполняемые внутри блока
with:
, не будут подвержены смыву при обращении к запросу. Это полезно при инициализации серии объектов, включающих существующие запросы к базе данных, когда незавершенный объект еще не должен быть смыт.
-
classmethod
sqlalchemy.orm.Session.
object_session(instance: object) Optional[Session] ¶ наследуется от
sqlalchemy.orm.session._SessionClassMethods.object_session
методаsqlalchemy.orm.session._SessionClassMethods
Возвращает
Session
, к которому принадлежит объект.Это псевдоним
object_session()
.
-
method
sqlalchemy.orm.Session.
prepare() None ¶ Подготовить текущую транзакцию к двухфазной фиксации.
Если транзакция не выполняется, то этот метод вызывает ошибку
InvalidRequestError
.Могут быть подготовлены только корневые транзакции двухфазных сессий. Если текущая транзакция таковой не является, то выдается сообщение
InvalidRequestError
.
-
method
sqlalchemy.orm.Session.
query(*entities: _ColumnsClauseArgument[Any], **kwargs: Any) Query[Any] ¶ Возвращает новый объект
Query
, соответствующий данномуSession
.Отметим, что объект
Query
является наследием SQLAlchemy 2.0; конструкцияselect()
теперь используется для построения ORM-запросов.См.также
Унифицированный учебник по SQLAlchemy
Руководство по составлению запросов в ORM
Legacy Query API - унаследованный документ по API
-
method
sqlalchemy.orm.Session.
refresh(instance: object, attribute_names: Optional[Iterable[str]] = None, with_for_update: ForUpdateParameter = None) None ¶ Истечение срока действия и обновление атрибутов для данного экземпляра.
Выбранные атрибуты сначала будут просрочены, как и при использовании
Session.expire()
; затем в базу данных будет отправлен оператор SELECT для обновления атрибутов, ориентированных на столбцы, текущим значением, доступным в текущей транзакции.Атрибуты, ориентированные на
relationship()
, также будут немедленно загружены, если они уже были загружены в объект с нетерпением, с использованием той же стратегии нетерпеливой загрузки, с которой они были загружены первоначально.Добавлено в версии 1.4: - the
Session.refresh()
method can also refresh eagerly loaded attributes.Атрибуты, ориентированные на
relationship()
, которые обычно загружаются с использованием стратегииselect
(или «ленивой») загрузки, также будут загружаться если они явно названы в коллекции attribute_names, выдавая оператор SELECT для атрибута с использованием стратегииimmediate
. Если отношения с «ленивой загрузкой» не поименованы вSession.refresh.attribute_names
, то они остаются «лениво загруженными» атрибутами и неявно не обновляются.Изменено в версии 2.0.4: Метод
Session.refresh()
теперь будет обновлять лениво загруженныеrelationship()
ориентированные атрибуты на те, которые явно названы в коллекцииSession.refresh.attribute_names
.Совет
Хотя метод
Session.refresh()
способен обновлять атрибуты, ориентированные как на столбцы, так и на отношения, его основной задачей является обновление локальных атрибутов, ориентированных на столбцы, на одном экземпляре. Для более широких возможностей обновления, включая возможность обновления атрибутов сразу для многих объектов при явном контроле над стратегиями загрузчика отношений, используйте функцию populate existing.Заметим, что высокоизолированная транзакция будет возвращать те же значения, которые были прочитаны ранее в этой же транзакции, независимо от изменений состояния базы данных вне этой транзакции. Обновление атрибутов обычно имеет смысл только в начале транзакции, когда к строкам базы данных еще не обращались.
- Параметры:
attribute_names – опционально. Итерабельная коллекция строковых имен атрибутов, указывающих на подмножество атрибутов, которые необходимо обновить.
with_for_update – необязательное булево
True
, указывающее, что должен использоваться FOR UPDATE, или может быть словарем, содержащим флаги для указания более конкретного набора флагов FOR UPDATE для SELECT; флаги должны соответствовать параметрамQuery.with_for_update()
. Заменяет параметрSession.refresh.lockmode
.
См.также
Обновление / истечение срока действия - вводный материал
Заполнить существующие - позволяет любому ORM-запросу обновлять объекты так, как они были бы загружены в обычном режиме.
-
method
sqlalchemy.orm.Session.
rollback() None ¶ Откат текущей выполняемой транзакции.
Если транзакция не проводится, этот метод является сквозным.
Метод всегда откатывает самую верхнюю транзакцию базы данных, отбрасывая все вложенные транзакции, которые могут находиться в процессе выполнения.
-
method
sqlalchemy.orm.Session.
scalar(statement: Executable, params: Optional[_CoreSingleExecuteParams] = None, *, execution_options: OrmExecuteOptionsParameter = {}, bind_arguments: Optional[_BindArguments] = None, **kw: Any) Any ¶ Выполнить оператор и вернуть скалярный результат.
Использование и параметры такие же, как у
Session.execute()
; возвращаемый результат - скалярное значение Python.
-
method
sqlalchemy.orm.Session.
scalars(statement: Executable, params: Optional[_CoreAnyExecuteParams] = None, *, execution_options: OrmExecuteOptionsParameter = {}, bind_arguments: Optional[_BindArguments] = None, **kw: Any) ScalarResult[Any] ¶ Выполнить оператор и вернуть результаты в виде скаляров.
Использование и параметры те же, что и у
Session.execute()
; возвращаемый результат - объект фильтрацииScalarResult
, который будет возвращать отдельные элементы, а не объектыRow
.- Результат:
объект
ScalarResult
Добавлено в версии 1.4.24: Добавлено
Session.scalars()
Добавлено в версии 1.4.26: Добавлено
scoped_session.scalars()
См.также
Выбор сущностей ORM - противопоставляет поведение
Session.execute()
поведениюSession.scalars()
-
method
- class sqlalchemy.orm.SessionTransaction¶
Транзакция уровня
Session
.SessionTransaction
образуется из методовSession.begin()
иSession.begin_nested()
. Это в основном внутренний объект, который в современном использовании обеспечивает контекстный менеджер для сеансовых транзакций.Документация по взаимодействию с
SessionTransaction
находится по адресу: Управление транзакциями.Изменено в версии 1.4: Упрощены скопинг и методы API для работы с объектом
SessionTransaction
напрямую.См.также
Классная подпись
класс
sqlalchemy.orm.SessionTransaction
(sqlalchemy.orm.state_changes._StateChange
,sqlalchemy.engine.util.TransactionalContext
)-
attribute
sqlalchemy.orm.SessionTransaction.
nested: bool = False¶ Указывает, является ли данная транзакция вложенной, или SAVEPOINT, транзакцией.
Если
SessionTransaction.nested
имеет значение True, то ожидается, чтоSessionTransaction.parent
также будет присутствовать, связываясь с вложеннымSessionTransaction
.См.также
-
attribute
sqlalchemy.orm.SessionTransaction.
origin: SessionTransactionOrigin¶ Происхождение этого
SessionTransaction
.Ссылается на экземпляр
SessionTransactionOrigin
, который представляет собой перечисление, указывающее на исходное событие, приведшее к построению данногоSessionTransaction
.Добавлено в версии 2.0.
-
attribute
sqlalchemy.orm.SessionTransaction.
parent¶ Родитель
SessionTransaction
данногоSessionTransaction
.Если этот атрибут равен
None
, то это означает, что даннаяSessionTransaction
находится на вершине стека и соответствует реальному блоку «COMMIT»/»ROLLBACK». Если не``None``, то это либо «субтранзакция» (внутренний объект-маркер, используемый процессом flush), либо «вложенная» / SAVEPOINT транзакция. Если атрибутSessionTransaction.nested
равенTrue
, то это SAVEPOINT, а еслиFalse
, то это субтранзакция.
-
attribute
- class sqlalchemy.orm.SessionTransactionOrigin¶
указывает на происхождение
SessionTransaction
.Это перечисление присутствует в атрибуте
SessionTransaction.origin
любого объектаSessionTransaction
.Добавлено в версии 2.0.
Members
Классная подпись
класс
sqlalchemy.orm.SessionTransactionOrigin
(enum.Enum
)-
attribute
sqlalchemy.orm.SessionTransactionOrigin.
AUTOBEGIN = 0¶ транзакции были начаты автобегином
-
attribute
sqlalchemy.orm.SessionTransactionOrigin.
BEGIN = 1¶ транзакция была запущена вызовом
Session.begin()
-
attribute
sqlalchemy.orm.SessionTransactionOrigin.
BEGIN_NESTED = 2¶ транзакция была начата
Session.begin_nested()
.
-
attribute
sqlalchemy.orm.SessionTransactionOrigin.
SUBTRANSACTION = 3¶ транзакция является внутренней «субтранзакцией»
-
attribute
Утилиты сессии¶
Object Name | Description |
---|---|
Закрыть все сессии в памяти. |
|
make_transient(instance) |
Измените состояние данного экземпляра так, чтобы оно было transient. |
make_transient_to_detached(instance) |
Сделать заданный переходный экземпляр detached. |
object_session(instance) |
Возвращает |
was_deleted(object_) |
Возвращает True, если заданный объект был удален в рамках session flush. |
- function sqlalchemy.orm.close_all_sessions() None ¶
Закрыть все сессии в памяти.
Эта функция обращается к глобальному реестру всех объектов
Session
и вызывает на них функциюSession.close()
, которая переводит их в чистое состояние.Эта функция не предназначена для общего использования, но может быть полезна для тестовых наборов в рамках схемы разрушения.
Добавлено в версии 1.3.
- function sqlalchemy.orm.make_transient(instance: object) None ¶
Измените состояние данного экземпляра так, чтобы оно было transient.
Примечание
make_transient()
- это специальная функция, предназначенная только для расширенных случаев использования.Предполагается, что данный отображаемый экземпляр находится в состоянии persistent или detached. Функция удалит его связь с любым
Session
, а также егоInstanceState.identity
. В результате объект будет вести себя так, как будто он только что создан, за исключением сохранения всех значений атрибутов/коллекций, которые были загружены на момент вызова. ФлагInstanceState.deleted
также сбрасывается, если этот объект был удален в результате использованияSession.delete()
.Предупреждение
make_transient()
не открывает или иным образом нетерпеливо загружает ORM-атрибуты, которые не загружены на момент вызова функции. К ним относятся атрибуты, которые:истекали через
Session.expire()
истекали как естественный эффект фиксации сеансовой транзакции, например,
Session.commit()
обычно lazy loaded, но в данный момент не загружены
являются «отложенными» (см. Ограничение загрузки столбцов с помощью функции Column Deferral) и еще не загружены
не присутствовали в запросе, загрузившем этот объект, как это часто бывает при наследовании объединенных таблиц и в других сценариях.
После вызова
make_transient()
выгруженные атрибуты, такие как приведенные выше, при обращении к ним обычно принимают значениеNone
или пустую коллекцию для атрибута, ориентированного на коллекцию. Поскольку объект является переходным и не связан ни с каким идентификатором базы данных, он больше не будет получать эти значения.См.также
- function sqlalchemy.orm.make_transient_to_detached(instance: object) None ¶
Сделать заданный переходный экземпляр detached.
Примечание
make_transient_to_detached()
- это специальная функция, предназначенная только для расширенных случаев использования.Вся история атрибутов данного экземпляра будет сброшена, как если бы экземпляр был только что загружен из запроса. Отсутствующие атрибуты будут помечены как просроченные. Атрибуты первичного ключа объекта, которые являются обязательными, будут превращены в «ключ» экземпляра.
Затем объект может быть добавлен в сессию или объединен, возможно, с флагом load=False, и тогда он будет выглядеть так, как будто он был загружен таким образом, не выдавая SQL.
Это специальная функция, которая отличается от обычного вызова
Session.merge()
тем, что заданное постоянное состояние может быть получено без каких-либо вызовов SQL.
- function sqlalchemy.orm.object_session(instance: object) Optional[Session] ¶
Возвращает
Session
, к которому принадлежит данный экземпляр.По сути, это то же самое, что и аксессор
InstanceState.session
. Подробности см. в этом атрибуте.
- function sqlalchemy.orm.util.was_deleted(object_: object) bool ¶
Возвращает True, если заданный объект был удален в рамках session flush.
Это происходит независимо от того, является ли объект постоянным или отделяемым.
См.также
Утилиты управления атрибутами и состояниями¶
Эти функции предоставляются SQLAlchemy attribute instrumentation API, чтобы обеспечить детальный интерфейс для работы с экземплярами, значениями атрибутов и историей. Некоторые из них полезны при построении функций-слушателей событий, например, описанных в События ОРМ.
Object Name | Description |
---|---|
del_attribute(instance, key) |
Удаление значения атрибута, вызывающее события истории. |
flag_dirty(instance) |
Пометить экземпляр как «грязный» без указания какого-либо конкретного атрибута. |
flag_modified(instance, key) |
Пометить атрибут экземпляра как «измененный». |
get_attribute(instance, key) |
Получить значение атрибута, отменив все необходимые вызовы. |
get_history(obj, key[, passive]) |
Возвращает запись |
Трехкортеж из добавленных, неизмененных и удаленных значений, представляющий изменения, произошедшие с инструментированным атрибутом. |
|
init_collection(obj, key) |
Инициализирует атрибут коллекции и возвращает адаптер коллекции. |
Возвращает |
|
is_instrumented(instance, key) |
Возвращает True, если заданный атрибут для данного экземпляра инструментирован пакетом attributes. |
object_state(instance) |
Если задан объект, то возвращается |
set_attribute(instance, key, value[, initiator]) |
Устанавливает значение атрибута, вызывая события истории. |
set_committed_value(instance, key, value) |
Установить значение атрибута, не имеющего событий в истории. |
- function sqlalchemy.orm.util.object_state(instance: _T) InstanceState[_T] ¶
Если задан объект, то возвращается
InstanceState
, связанный с этим объектом.Возникает
sqlalchemy.orm.exc.UnmappedInstanceError
, если отображение не настроено.Эквивалентная функциональность доступна через функцию
inspect()
в виде:inspect(instance)
Использование системы проверки приведет к появлению сообщения
sqlalchemy.exc.NoInspectionAvailable
, если экземпляр не является частью отображения.
- function sqlalchemy.orm.attributes.del_attribute(instance: object, key: str) None ¶
Удаление значения атрибута, вызывающее события истории.
Эта функция может использоваться независимо от инструментария, применяемого непосредственно к классу, т.е. дескрипторы не требуются. Пользовательские схемы управления атрибутами должны использовать этот метод для определения состояния атрибутов в понимании SQLAlchemy.
- function sqlalchemy.orm.attributes.get_attribute(instance: object, key: str) Any ¶
Получить значение атрибута, отменив все необходимые вызовы.
Эта функция может использоваться независимо от инструментария, применяемого непосредственно к классу, т.е. дескрипторы не требуются. Пользовательские схемы управления атрибутами должны использовать этот метод для использования состояния атрибутов в понимании SQLAlchemy.
- function sqlalchemy.orm.attributes.get_history(obj: object, key: str, passive: PassiveFlag = symbol('PASSIVE_OFF')) History ¶
Возвращает запись
History
для заданного объекта и ключа атрибута.Это история pre-flush для данного атрибута, которая сбрасывается каждый раз, когда
Session
сбрасывает изменения в текущую транзакцию базы данных.Примечание
Предпочтительнее использовать аксессоры
AttributeState.history
иAttributeState.load_history()
для получения атрибутов экземпляраHistory
.- Параметры:
obj – объект, класс которого инструментирован пакетом attributes.
key – строковое имя атрибута.
passive – указывает на поведение при загрузке атрибута, если значение еще не присутствует. Это атрибут bitflag, который по умолчанию имеет символ
PASSIVE_OFF
, указывающий на то, что все необходимые SQL должны быть выданы.
См.также
AttributeState.load_history()
- получение истории с помощью вызываемых элементов загрузчика, если значение не присутствует локально.
- function sqlalchemy.orm.attributes.init_collection(obj: object, key: str) CollectionAdapter ¶
Инициализирует атрибут коллекции и возвращает адаптер коллекции.
Эта функция используется для предоставления прямого доступа к внутренним элементам коллекции для ранее выгруженного атрибута. Например:
collection_adapter = init_collection(someobject, 'elements') for elem in values: collection_adapter.append_without_event(elem)
Более простой способ выполнения описанных выше действий приведен в разделе
set_committed_value()
.- Параметры:
obj – отображаемый объект
key – строковое имя атрибута, в котором находится коллекция.
- function sqlalchemy.orm.attributes.flag_modified(instance: object, key: str) None ¶
Пометить атрибут экземпляра как «измененный».
Это устанавливает флаг „modified“ для экземпляра и устанавливает безусловное событие изменения для заданного атрибута. В атрибуте должно присутствовать значение, в противном случае выдается сообщение
InvalidRequestError
.Чтобы пометить объект «грязным» без ссылки на какой-либо конкретный атрибут, чтобы он рассматривался в рамках flush, используйте вызов
flag_dirty()
.См.также
- function sqlalchemy.orm.attributes.flag_dirty(instance: object) None ¶
Пометить экземпляр как «грязный» без указания какого-либо конкретного атрибута.
Это специальная операция, которая позволит объекту пройти через процесс flush для перехвата такими событиями, как
SessionEvents.before_flush()
. Обратите внимание, что для объекта, не имеющего изменений, даже если он был помечен грязным с помощью этого метода, в процессе flush не будет выдан SQL. Однако обработчикSessionEvents.before_flush()
сможет увидеть объект в коллекцииSession.dirty
и может установить в нем изменения, которые затем будут включены в выдаваемый SQL.Добавлено в версии 1.2.
См.также
- function sqlalchemy.orm.attributes.instance_state()¶
Возвращает
InstanceState
для заданного отображаемого объекта.Эта функция является внутренней версией
object_state()
. Здесь предпочтительнее использовать функциюobject_state()
и/илиinspect()
, поскольку каждая из них выдает информативное исключение, если данный объект не сопоставлен.
- function sqlalchemy.orm.instrumentation.is_instrumented(instance, key)¶
Возвращает True, если заданный атрибут для данного экземпляра инструментирован пакетом attributes.
Эта функция может использоваться независимо от инструментария, применяемого непосредственно к классу, т.е. дескрипторы не требуются.
- function sqlalchemy.orm.attributes.set_attribute(instance: object, key: str, value: Any, initiator: Optional[AttributeEventToken] = None) None ¶
Устанавливает значение атрибута, вызывая события истории.
Эта функция может использоваться независимо от инструментария, применяемого непосредственно к классу, т.е. дескрипторы не требуются. Пользовательские схемы управления атрибутами должны использовать этот метод для определения состояния атрибутов в понимании SQLAlchemy.
- Параметры:
instance – объект, который будет изменен
key – строковое имя атрибута
value – значение для присвоения
initiator – экземпляр
Event
, который был бы передан от предыдущего слушателя событий. Этот аргумент используется, когда функцияset_attribute()
используется внутри существующей функции прослушивания событий, в которую передается объектEvent
; этот объект может быть использован для отслеживания начала цепочки событий. … versionadded:: 1.2.3
- function sqlalchemy.orm.attributes.set_committed_value(instance, key, value)¶
Установить значение атрибута, не имеющего событий в истории.
Отменяет любую предыдущую историю. Значение должно быть скалярным для атрибутов, содержащих скаляр, или итерируемым для любого атрибута, содержащего коллекцию.
Этот же метод используется, когда ленивый загрузчик срабатывает и загружает дополнительные данные из базы данных. В частности, этот метод может быть использован кодом приложения, который загрузил дополнительные атрибуты или коллекции с помощью отдельных запросов, которые затем могут быть присоединены к экземпляру, как если бы они были частью его исходного загруженного состояния.
- class sqlalchemy.orm.attributes.History¶
Трехкортеж из добавленных, неизмененных и удаленных значений, представляющий изменения, произошедшие с инструментированным атрибутом.
Самый простой способ получить объект
History
для определенного атрибута объекта - использовать функциюinspect()
:from sqlalchemy import inspect hist = inspect(myobject).attrs.myattribute.history
Каждый член кортежа представляет собой итерируемую последовательность:
added
- коллекция элементов, добавляемых к атрибуту (первый элемент кортежа).unchanged
- коллекция элементов, не изменившихся по атрибуту (второй элемент кортежа).deleted
- коллекция элементов, которые были удалены из атрибута (третий элемент кортежа).
Members
added, deleted, empty(), has_changes(), non_added(), non_deleted(), sum(), unchanged
Классная подпись
класс
sqlalchemy.orm.History
(builtins.tuple
)-
attribute
sqlalchemy.orm.attributes.History.
added: Union[Tuple[()], List[Any]]¶ Псевдоним для номера поля 0
-
attribute
sqlalchemy.orm.attributes.History.
deleted: Union[Tuple[()], List[Any]]¶ Псевдоним для поля номер 2
-
method
sqlalchemy.orm.attributes.History.
empty() bool ¶ Возвращает True, если данная
History
не имеет изменений и существующего, неизменного состояния.
-
method
sqlalchemy.orm.attributes.History.
has_changes() bool ¶ Возвращает True, если в данном
History
произошли изменения.
-
method
sqlalchemy.orm.attributes.History.
non_added() Sequence[Any] ¶ Возвращает коллекцию неизмененных + удаленных.
-
method
sqlalchemy.orm.attributes.History.
non_deleted() Sequence[Any] ¶ Возвращает коллекцию добавленных + неизмененных.
-
method
sqlalchemy.orm.attributes.History.
sum() Sequence[Any] ¶ Возвращает коллекцию добавленных + неизмененных + удаленных.
-
attribute
sqlalchemy.orm.attributes.History.
unchanged: Union[Tuple[()], List[Any]]¶ Псевдоним для поля номер 1