Основные мероприятия¶
Object Name | Description |
---|---|
Определите функции прослушивания событий для конкретного типа цели. |
- class sqlalchemy.event.base.Events¶
Определите функции прослушивания событий для конкретного типа цели.
Members
Классная подпись
класс
sqlalchemy.event.Events
(sqlalchemy.event._HasEventsDispatch
)-
attribute
sqlalchemy.event.base.Events.
dispatch: _Dispatch[_ET] = <sqlalchemy.event.base.EventsDispatch object>¶ ссылка обратно на класс _Dispatch.
Двунаправленный по отношению к _Dispatch._events
-
attribute
События пула подключений¶
Object Name | Description |
---|---|
:class:`_pool.Pool`A |
|
:meth:`.PoolEvents.reset`d |
- class sqlalchemy.events.PoolEvents¶
:class:`_pool.Pool`A
Приведенные здесь методы определяют имя события, а также имена членов, которые передаются функциям-слушателям.
например:
from sqlalchemy import event def my_on_checkout(dbapi_conn, connection_rec, connection_proxy): "handle an on checkout event" event.listen(Pool, 'checkout', my_on_checkout)
Pool
Pool
PoolEvents
Engine
Engine
.pool
Pool
Iengine = create_engine("postgresql+psycopg2://scott:tiger@localhost/test") # will associate with engine.pool event.listen(engine, 'checkout', my_on_checkout)
Members
checkin(), checkout(), close(), close_detached(), connect(), detach(), dispatch, first_connect(), invalidate(), reset(), soft_invalidate()
Классная подпись
класс
sqlalchemy.events.PoolEvents
(sqlalchemy.event.Events
)-
method
sqlalchemy.events.PoolEvents.
checkin(dbapi_connection: DBAPIConnection, connection_record: ConnectionPoolEntry) None ¶ Вызывается, когда соединение возвращается в пул.
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngineOrPool, 'checkin') def receive_checkin(dbapi_connection, connection_record): "listen for the 'checkin' event" # ... (event handling logic) ...
``checkin``N
-
method
sqlalchemy.events.PoolEvents.
checkout(dbapi_connection: DBAPIConnection, connection_record: ConnectionPoolEntry, connection_proxy: PoolProxiedConnection) None ¶ Вызывается, когда соединение извлекается из пула.
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngineOrPool, 'checkout') def receive_checkout(dbapi_connection, connection_record, connection_proxy): "listen for the 'checkout' event" # ... (event handling logic) ...
- Параметры:
:class:`~sqlalchemy.exc.DisconnectionError`I
См.также
-
method
sqlalchemy.events.PoolEvents.
close(dbapi_connection: DBAPIConnection, connection_record: ConnectionPoolEntry) None ¶ Вызывается при закрытии соединения DBAPI.
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngineOrPool, 'close') def receive_close(dbapi_connection, connection_record): "listen for the 'close' event" # ... (event handling logic) ...
Событие выдается до того, как произойдет закрытие.
Закрытие соединения может завершиться неудачей; обычно это происходит потому, что соединение уже закрыто. Если операция закрытия завершается неудачно, соединение отбрасывается.
-
method
sqlalchemy.events.PoolEvents.
close_detached(dbapi_connection: DBAPIConnection) None ¶ Вызывается при закрытии отсоединенного DBAPI-соединения.
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngineOrPool, 'close_detached') def receive_close_detached(dbapi_connection): "listen for the 'close_detached' event" # ... (event handling logic) ...
Событие выдается до того, как произойдет закрытие.
Закрытие соединения может завершиться неудачей; обычно это происходит потому, что соединение уже закрыто. Если операция закрытия завершается неудачно, соединение отбрасывается.
- Параметры:
dbapi_connection – :attr:`.ConnectionPoolEntry.dbapi_connection`a
-
method
sqlalchemy.events.PoolEvents.
connect(dbapi_connection: DBAPIConnection, connection_record: ConnectionPoolEntry) None ¶ :class:`_pool.Pool`C
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngineOrPool, 'connect') def receive_connect(dbapi_connection, connection_record): "listen for the 'connect' event" # ... (event handling logic) ...
``.connect()``T
-
method
sqlalchemy.events.PoolEvents.
detach(dbapi_connection: DBAPIConnection, connection_record: ConnectionPoolEntry) None ¶ Вызывается при «отсоединении» DBAPI-соединения от пула.
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngineOrPool, 'detach') def receive_detach(dbapi_connection, connection_record): "listen for the 'detach' event" # ... (event handling logic) ...
Это событие выдается после того, как произойдет отсоединение. Соединение больше не ассоциируется с данной записью соединения.
-
attribute
sqlalchemy.events.PoolEvents.
dispatch: _Dispatch[_ET] = <sqlalchemy.event.base.PoolEventsDispatch object>¶ ссылка обратно на класс _Dispatch.
Двунаправленный по отношению к _Dispatch._events
-
method
sqlalchemy.events.PoolEvents.
first_connect(dbapi_connection: DBAPIConnection, connection_record: ConnectionPoolEntry) None ¶ :class:`_pool.Pool`C
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngineOrPool, 'first_connect') def receive_first_connect(dbapi_connection, connection_record): "listen for the 'first_connect' event" # ... (event handling logic) ...
-
method
sqlalchemy.events.PoolEvents.
invalidate(dbapi_connection: DBAPIConnection, connection_record: ConnectionPoolEntry, exception: Optional[BaseException]) None ¶ Вызывается, когда соединение DBAPI должно быть «аннулировано».
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngineOrPool, 'invalidate') def receive_invalidate(dbapi_connection, connection_record, exception): "listen for the 'invalidate' event" # ... (event handling logic) ...
ConnectionPoolEntry.invalidate()
soft
T``.close()``T
- Параметры:
См.также
-
method
sqlalchemy.events.PoolEvents.
reset(dbapi_connection: DBAPIConnection, connection_record: ConnectionPoolEntry, reset_state: PoolResetState) None ¶ Вызывается перед выполнением действия «сброс» для соединения с пулом.
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngineOrPool, 'reset') def receive_reset(dbapi_connection, connection_record, reset_state): "listen for the 'reset' event" # ... (event handling logic) ... # DEPRECATED calling style (pre-2.0, will be removed in a future release) @event.listens_for(SomeEngineOrPool, 'reset') def receive_reset(dbapi_connection, connection_record): "listen for the 'reset' event" # ... (event handling logic) ...
Изменено в версии 2.0:
PoolEvents.reset()
PoolEvents.reset.dbapi_connection
PoolEvents.reset.connection_record
PoolEvents.reset.reset_state
Trollback()
Pool.reset_on_return
TPoolEvents.reset()
PoolEvents.checkin()
PoolEvents.reset()
Connection.detach()
TConnection.invalidate()
PoolEvents.soft_invalidate()
PoolEvents.invalidate()
PoolEvents.close()
N
-
method
sqlalchemy.events.PoolEvents.
soft_invalidate(dbapi_connection: DBAPIConnection, connection_record: ConnectionPoolEntry, exception: Optional[BaseException]) None ¶ Вызывается, когда соединение DBAPI должно быть «мягко аннулировано».
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngineOrPool, 'soft_invalidate') def receive_soft_invalidate(dbapi_connection, connection_record, exception): "listen for the 'soft_invalidate' event" # ... (event handling logic) ...
ConnectionPoolEntry.invalidate()
soft
TМягкое аннулирование относится к случаю, когда запись соединения, отслеживающая данное соединение, принудительно переподключается после того, как текущее соединение зарегистрировано. При этом не происходит активного закрытия dbapi_connection в момент его вызова.
-
method
- class sqlalchemy.events.PoolResetState¶
:meth:`.PoolEvents.reset`d
Members
Добавлено в версии 2.0.0b3.
-
attribute
sqlalchemy.events.PoolResetState.
asyncio_safe: bool¶ Указывает, происходит ли операция сброса в области, где ожидается наличие вложенного цикла событий для приложений asyncio.
Будет иметь значение False в случае, если соединение собирается в мусор.
-
attribute
sqlalchemy.events.PoolResetState.
terminate_only: bool¶ указывает, должно ли соединение немедленно завершаться и не регистрироваться в пуле.
Это происходит для соединений, которые были признаны недействительными, а также для соединений asyncio, которые не были чисто обработаны вызывающим кодом и вместо этого собираются в мусор. В последнем случае операции над asyncio-соединениями в рамках сборки мусора не могут быть безопасно выполнены, так как не всегда присутствует цикл событий.
-
attribute
sqlalchemy.events.PoolResetState.
transaction_was_reset: bool¶ :class:`.Connection`I
Connection
Connection.rollback()
Connection.commit()
Connection.close()
T
-
attribute
События выполнения SQL и подключения¶
Object Name | Description |
---|---|
событийный интерфейс для функций замещения исполнения. |
- class sqlalchemy.events.ConnectionEvents¶
-
Приведенные здесь методы определяют имя события, а также имена членов, которые передаются функциям-слушателям.
from sqlalchemy import event, create_engine def before_cursor_execute(conn, cursor, statement, parameters, context, executemany): log.info("Received statement: %s", statement) engine = create_engine('postgresql+psycopg2://scott:tiger@localhost/test') event.listen(engine, "before_cursor_execute", before_cursor_execute)
:class:`_engine.Connection`o
with engine.begin() as conn: @event.listens_for(conn, 'before_cursor_execute') def before_cursor_execute(conn, cursor, statement, parameters, context, executemany): log.info("Received statement: %s", statement)
after_cursor_execute()
before_cursor_execute()
cursor
Dialect
Wbefore_execute()
before_cursor_execute()
retval=True
before_cursor_execute()
Tfrom sqlalchemy.engine import Engine from sqlalchemy import event @event.listens_for(Engine, "before_cursor_execute", retval=True) def comment_sql_calls(conn, cursor, statement, parameters, context, executemany): statement = statement + " -- some comment" return statement, parameters
Примечание
ConnectionEvents
Engine
Connection
Connection
Connection
Engine
Engine
Engine
Connection
Connection
Connection
Engine
<- Параметры:
retval=False –
before_execute()
before_cursor_execute()
A
Members
after_cursor_execute(), after_execute(), before_cursor_execute(), before_execute(), begin(), begin_twophase(), commit(), commit_twophase(), dispatch, engine_connect(), engine_disposed(), prepare_twophase(), release_savepoint(), rollback(), rollback_savepoint(), rollback_twophase(), savepoint(), set_connection_execution_options(), set_engine_execution_options()
Классная подпись
класс
sqlalchemy.events.ConnectionEvents
(sqlalchemy.event.Events
)-
method
sqlalchemy.events.ConnectionEvents.
after_cursor_execute(conn: Connection, cursor: DBAPICursor, statement: str, parameters: _DBAPIAnyExecuteParams, context: Optional[ExecutionContext], executemany: bool) None ¶ Перехват низкоуровневых событий курсора execute() после его выполнения.
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'after_cursor_execute') def receive_after_cursor_execute(conn, cursor, statement, parameters, context, executemany): "listen for the 'after_cursor_execute' event" # ... (event handling logic) ...
- Параметры:
conn – :class:`_engine.Connection`<
cursor – :class:`_engine.CursorResult`D
statement – строковый SQL-оператор, передаваемый в DBAPI
parameters –
execute()
executemany()
cursor
None
Dcontext –
ExecutionContext
None
<executemany –
True
executemany()
False
execute()
b
-
method
sqlalchemy.events.ConnectionEvents.
after_execute(conn: Connection, clauseelement: Executable, multiparams: _CoreMultiExecuteParams, params: _CoreSingleExecuteParams, execution_options: _ExecuteOptions, result: Result[Any]) None ¶ Перехват событий высокого уровня execute() после выполнения.
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'after_execute') def receive_after_execute(conn, clauseelement, multiparams, params, execution_options, result): "listen for the 'after_execute' event" # ... (event handling logic) ... # DEPRECATED calling style (pre-1.4, will be removed in a future release) @event.listens_for(SomeEngine, 'after_execute') def receive_after_execute(conn, clauseelement, multiparams, params, result): "listen for the 'after_execute' event" # ... (event handling logic) ...
Изменено в версии 1.4:
ConnectionEvents.after_execute()
ConnectionEvents.after_execute.conn
ConnectionEvents.after_execute.clauseelement
ConnectionEvents.after_execute.multiparams
ConnectionEvents.after_execute.params
ConnectionEvents.after_execute.execution_options
ConnectionEvents.after_execute.result
T- Параметры:
conn – :class:`_engine.Connection`<
clauseelement –
Compiled
Connection.execute()
Smultiparams – Множество наборов параметров, список словарей.
params – Один набор параметров, один словарь.
execution_options – словарь опций выполнения, переданных вместе с оператором, если таковые имеются. Это объединение всех опций, которые будут использоваться, включая опции оператора, соединения и опции, передаваемые в сам метод для стиля выполнения 2.0. … версия добавлена: 1.4
result – :class:`_engine.CursorResult`<
-
method
sqlalchemy.events.ConnectionEvents.
before_cursor_execute(conn: Connection, cursor: DBAPICursor, statement: str, parameters: _DBAPIAnyExecuteParams, context: Optional[ExecutionContext], executemany: bool) Optional[Tuple[str, _DBAPIAnyExecuteParams]] ¶ Перехватывать низкоуровневые события execute() курсора перед его выполнением, получая строковый SQL-оператор и специфичный для DBAPI список параметров для вызова к курсору.
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'before_cursor_execute') def receive_before_cursor_execute(conn, cursor, statement, parameters, context, executemany): "listen for the 'before_cursor_execute' event" # ... (event handling logic) ...
Это событие хорошо подходит для протоколирования, а также для поздних модификаций строки SQL. Оно не очень подходит для модификации параметров, за исключением тех, которые специфичны для целевого бэкенда.
retval=True
statement
parameters
T@event.listens_for(Engine, "before_cursor_execute", retval=True) def before_cursor_execute(conn, cursor, statement, parameters, context, executemany): # do something with statement, parameters return statement, parameters
:class:`_events.ConnectionEvents`S
- Параметры:
conn – :class:`_engine.Connection`<
cursor – Объект курсора DBAPI
statement – строковый SQL-оператор, который должен быть передан в DBAPI
parameters –
execute()
executemany()
cursor
None
Dcontext –
ExecutionContext
None
<executemany –
True
executemany()
False
execute()
b
-
method
sqlalchemy.events.ConnectionEvents.
before_execute(conn: Connection, clauseelement: Executable, multiparams: _CoreMultiExecuteParams, params: _CoreSingleExecuteParams, execution_options: _ExecuteOptions) Optional[Tuple[Executable, _CoreMultiExecuteParams, _CoreSingleExecuteParams]] ¶ Перехват событий высокого уровня execute(), получение некомпилированных конструкций SQL и других объектов до их преобразования в SQL.
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'before_execute') def receive_before_execute(conn, clauseelement, multiparams, params, execution_options): "listen for the 'before_execute' event" # ... (event handling logic) ... # DEPRECATED calling style (pre-1.4, will be removed in a future release) @event.listens_for(SomeEngine, 'before_execute') def receive_before_execute(conn, clauseelement, multiparams, params): "listen for the 'before_execute' event" # ... (event handling logic) ...
Изменено в версии 1.4: Событие
ConnectionEvents.before_execute()
теперь принимает аргументыConnectionEvents.before_execute.conn
,ConnectionEvents.before_execute.clauseelement
,ConnectionEvents.before_execute.multiparams
,ConnectionEvents.before_execute.params
,ConnectionEvents.before_execute.execution_options
. Поддержка функций слушателя, принимающих предыдущие сигнатуры аргументов, перечисленные выше как «устаревшие», будет удалена в одном из будущих выпусков.Это событие полезно для отладки проблем компиляции SQL, а также для раннего манипулирования параметрами, отправляемыми в базу данных, поскольку здесь списки параметров будут иметь согласованный формат.
Это событие может быть опционально установлено с помощью флага
retval=True
. Аргументыclauseelement
,multiparams
иparams
в этом случае должны быть возвращены в виде кортежа:@event.listens_for(Engine, "before_execute", retval=True) def before_execute(conn, clauseelement, multiparams, params): # do something with clauseelement, multiparams, params return clauseelement, multiparams, params
- Параметры:
conn – :class:`_engine.Connection`<
clauseelement –
Compiled
Connection.execute()
Smultiparams – Множество наборов параметров, список словарей.
params – Один набор параметров, один словарь.
execution_options – словарь опций выполнения, переданных вместе с оператором, если таковые имеются. Это объединение всех опций, которые будут использоваться, включая опции оператора, соединения и опции, передаваемые в сам метод для стиля выполнения 2.0. … версия добавлена: 1.4
См.также
-
method
sqlalchemy.events.ConnectionEvents.
begin(conn: Connection) None ¶ Перехватывайте события begin().
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'begin') def receive_begin(conn): "listen for the 'begin' event" # ... (event handling logic) ...
- Параметры:
conn – :class:`_engine.Connection`<
-
method
sqlalchemy.events.ConnectionEvents.
begin_twophase(conn: Connection, xid: Any) None ¶ Перехват событий begin_twophase().
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'begin_twophase') def receive_begin_twophase(conn, xid): "listen for the 'begin_twophase' event" # ... (event handling logic) ...
- Параметры:
conn – :class:`_engine.Connection`<
xid – двухфазный идентификатор XID
-
method
sqlalchemy.events.ConnectionEvents.
commit(conn: Connection) None ¶ Перехват событий commit(), инициированных командой
Transaction
.Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'commit') def receive_commit(conn): "listen for the 'commit' event" # ... (event handling logic) ...
Обратите внимание, что
Pool
может также «автоматически фиксировать» соединение DBAPI при регистрации, если флагreset_on_return
установлен в значение'commit'
. Чтобы перехватить эту фиксацию, используйте хукPoolEvents.reset()
.- Параметры:
conn – :class:`_engine.Connection`<
-
method
sqlalchemy.events.ConnectionEvents.
commit_twophase(conn: Connection, xid: Any, is_prepared: bool) None ¶ Перехватывайте события commit_twophase().
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'commit_twophase') def receive_commit_twophase(conn, xid, is_prepared): "listen for the 'commit_twophase' event" # ... (event handling logic) ...
- Параметры:
conn – :class:`_engine.Connection`<
xid – двухфазный идентификатор XID
is_prepared – boolean, указывает, было ли вызвано
TwoPhaseTransaction.prepare()
.
-
attribute
sqlalchemy.events.ConnectionEvents.
dispatch: _Dispatch[_ET] = <sqlalchemy.event.base.ConnectionEventsDispatch object>¶ ссылка обратно на класс _Dispatch.
Двунаправленный по отношению к _Dispatch._events
-
method
sqlalchemy.events.ConnectionEvents.
engine_connect(conn: Connection) None ¶ Перехват создания нового
Connection
.Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'engine_connect') def receive_engine_connect(conn): "listen for the 'engine_connect' event" # ... (event handling logic) ... # DEPRECATED calling style (pre-2.0, will be removed in a future release) @event.listens_for(SomeEngine, 'engine_connect') def receive_engine_connect(conn, branch): "listen for the 'engine_connect' event" # ... (event handling logic) ...
Изменено в версии 2.0: Событие
ConnectionEvents.engine_connect()
теперь принимает аргументыConnectionEvents.engine_connect.conn
. Поддержка функций слушателя, которые принимают предыдущие сигнатуры аргументов, перечисленные выше как «устаревшие», будет удалена в одном из будущих выпусков.Это событие вызывается обычно как прямой результат вызова метода
Engine.connect()
.Оно отличается от метода
PoolEvents.connect()
, который относится к фактическому соединению с базой данных на уровне DBAPI; соединение DBAPI может быть объединено и повторно использовано для многих операций. В отличие от этого, данное событие относится только к созданию обертки более высокого уровняConnection
вокруг такого DBAPI-соединения.Оно также отличается от события
PoolEvents.checkout()
тем, что специфично для объектаConnection
, а не для соединения DBAPI, с которым работаетPoolEvents.checkout()
, хотя это соединение DBAPI доступно здесь через атрибутConnection.connection
. Но обратите внимание, что в течение жизни одного объектаConnection
может произойти несколько событийPoolEvents.checkout()
, если этот объектConnection
аннулируется и восстанавливается.- Параметры:
conn –
Connection
объект.
См.также
PoolEvents.checkout()
событие проверки пула нижнего уровня для отдельного соединения DBAPI
-
method
sqlalchemy.events.ConnectionEvents.
engine_disposed(engine: Engine) None ¶ Перехват при вызове метода
Engine.dispose()
.Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'engine_disposed') def receive_engine_disposed(engine): "listen for the 'engine_disposed' event" # ... (event handling logic) ...
Метод
Engine.dispose()
дает команду движку «утилизировать» свой пул соединений (например,Pool
) и заменяет его новым. Утилизация старого пула приводит к тому, что существующие зарегистрированные соединения закрываются. Новый пул не устанавливает новых соединений до тех пор, пока он не будет впервые использован.Это событие можно использовать для указания того, что ресурсы, связанные с
Engine
, также должны быть очищены, не забывая о том, чтоEngine
может по-прежнему использоваться для новых запросов, в этом случае он снова приобретает ресурсы соединения.
-
method
sqlalchemy.events.ConnectionEvents.
prepare_twophase(conn: Connection, xid: Any) None ¶ Перехватывайте события prepare_twophase().
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'prepare_twophase') def receive_prepare_twophase(conn, xid): "listen for the 'prepare_twophase' event" # ... (event handling logic) ...
- Параметры:
conn – :class:`_engine.Connection`<
xid – двухфазный идентификатор XID
-
method
sqlalchemy.events.ConnectionEvents.
release_savepoint(conn: Connection, name: str, context: None) None ¶ Перехватывайте события release_savepoint().
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'release_savepoint') def receive_release_savepoint(conn, name, context): "listen for the 'release_savepoint' event" # ... (event handling logic) ...
- Параметры:
conn – :class:`_engine.Connection`<
name – указанное имя, используемое для точки сохранения.
context – не используется
-
method
sqlalchemy.events.ConnectionEvents.
rollback(conn: Connection) None ¶ Перехват событий rollback(), инициированных командой
Transaction
.Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'rollback') def receive_rollback(conn): "listen for the 'rollback' event" # ... (event handling logic) ...
Обратите внимание, что
Pool
также «автоматически откатывает» соединение DBAPI при регистрации, если флагreset_on_return
установлен в значение по умолчанию'rollback'
. Чтобы перехватить этот откат, используйте хукPoolEvents.reset()
.- Параметры:
conn – :class:`_engine.Connection`<
См.также
-
method
sqlalchemy.events.ConnectionEvents.
rollback_savepoint(conn: Connection, name: str, context: None) None ¶ Перехватывайте события rollback_savepoint().
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'rollback_savepoint') def receive_rollback_savepoint(conn, name, context): "listen for the 'rollback_savepoint' event" # ... (event handling logic) ...
- Параметры:
conn – :class:`_engine.Connection`<
name – указанное имя, используемое для точки сохранения.
context – не используется
-
method
sqlalchemy.events.ConnectionEvents.
rollback_twophase(conn: Connection, xid: Any, is_prepared: bool) None ¶ Перехватывайте события rollback_twophase().
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'rollback_twophase') def receive_rollback_twophase(conn, xid, is_prepared): "listen for the 'rollback_twophase' event" # ... (event handling logic) ...
- Параметры:
conn – :class:`_engine.Connection`<
xid – двухфазный идентификатор XID
is_prepared – boolean, указывает, было ли вызвано
TwoPhaseTransaction.prepare()
.
-
method
sqlalchemy.events.ConnectionEvents.
savepoint(conn: Connection, name: str) None ¶ Перехват событий savepoint().
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'savepoint') def receive_savepoint(conn, name): "listen for the 'savepoint' event" # ... (event handling logic) ...
- Параметры:
conn – :class:`_engine.Connection`<
name – указанное имя, используемое для точки сохранения.
-
method
sqlalchemy.events.ConnectionEvents.
set_connection_execution_options(conn: Connection, opts: Dict[str, Any]) None ¶ Перехват при вызове метода
Connection.execution_options()
.Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'set_connection_execution_options') def receive_set_connection_execution_options(conn, opts): "listen for the 'set_connection_execution_options' event" # ... (event handling logic) ...
Этот метод вызывается после создания нового
Connection
с обновленной коллекцией опций выполнения, но до того, какDialect
начнет действовать в соответствии с этими новыми опциями.Обратите внимание, что этот метод не вызывается, когда создается новый
Connection
, который наследует параметры выполнения от своего родителяEngine
; чтобы перехватить это условие, используйте событиеConnectionEvents.engine_connect()
.- Параметры:
conn – Новый скопированный объект
Connection
opts – словарь опций, которые были переданы методу
Connection.execution_options()
. Этот словарь может быть изменен на месте, чтобы повлиять на конечные опции, которые вступят в силу. … versionadded:: 2.0 словарьopts
может быть изменен на месте.
См.также
ConnectionEvents.set_engine_execution_options()
- событие, которое вызывается при вызовеEngine.execution_options()
.
-
method
sqlalchemy.events.ConnectionEvents.
set_engine_execution_options(engine: Engine, opts: Dict[str, Any]) None ¶ Перехват при вызове метода
Engine.execution_options()
.Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'set_engine_execution_options') def receive_set_engine_execution_options(engine, opts): "listen for the 'set_engine_execution_options' event" # ... (event handling logic) ...
Метод
Engine.execution_options()
создает неглубокую копиюEngine
, в которой хранятся новые опции. Этот новыйEngine
передается сюда. Особым применением этого метода является добавление обработчика событияConnectionEvents.engine_connect()
к данномуEngine
, который будет выполнять некоторую пер-Connection
задачу, специфичную для данных опций выполнения.- Параметры:
conn – Новый скопированный объект
Engine
opts – словарь опций, которые были переданы методу
Connection.execution_options()
. Этот словарь может быть изменен на месте, чтобы повлиять на конечные опции, которые вступят в силу. … versionadded:: 2.0 словарьopts
может быть изменен на месте.
См.также
ConnectionEvents.set_connection_execution_options()
- событие, которое вызывается при вызовеConnection.execution_options()
.
- class sqlalchemy.events.DialectEvents¶
событийный интерфейс для функций замещения исполнения.
Эти события позволяют напрямую инструментировать и заменять ключевые функции диалекта, которые взаимодействуют с DBAPI.
Примечание
Крючки
DialectEvents
следует рассматривать как полупубличные и экспериментальные. Эти крючки не предназначены для общего использования и только для тех ситуаций, когда необходимо внедрить замысловатую переформулировку механики DBAPI в существующий диалект. Для общего использования событий перехвата утверждений, пожалуйста, используйте интерфейсConnectionEvents
.См.также
ConnectionEvents.before_cursor_execute()
ConnectionEvents.before_execute()
Members
dispatch, do_connect(), do_execute(), do_execute_no_params(), do_executemany(), do_setinputsizes(), handle_error()
Классная подпись
класс
sqlalchemy.events.DialectEvents
(sqlalchemy.event.Events
)-
attribute
sqlalchemy.events.DialectEvents.
dispatch: _Dispatch[_ET] = <sqlalchemy.event.base.DialectEventsDispatch object>¶ ссылка обратно на класс _Dispatch.
Двунаправленный по отношению к _Dispatch._events
-
method
sqlalchemy.events.DialectEvents.
do_connect(dialect: Dialect, conn_rec: ConnectionPoolEntry, cargs: Tuple[Any, ...], cparams: Dict[str, Any]) Optional[DBAPIConnection] ¶ Получение аргументов подключения до установления соединения.
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'do_connect') def receive_do_connect(dialect, conn_rec, cargs, cparams): "listen for the 'do_connect' event" # ... (event handling logic) ...
Это событие полезно тем, что позволяет обработчику манипулировать коллекциями cargs и/или cparams, которые управляют тем, как будет вызвана функция DBAPI
connect()
.cargs
всегда будет списком Python, который может быть изменен на месте, аcparams
- словарем Python, который также может быть изменен:e = create_engine("postgresql+psycopg2://user@host/dbname") @event.listens_for(e, 'do_connect') def receive_do_connect(dialect, conn_rec, cargs, cparams): cparams["password"] = "some_password"
Крючок событий можно также использовать для полной отмены вызова
connect()
, возвращая не``None`` объект соединения DBAPI:e = create_engine("postgresql+psycopg2://user@host/dbname") @event.listens_for(e, 'do_connect') def receive_do_connect(dialect, conn_rec, cargs, cparams): return psycopg2.connect(*cargs, **cparams)
-
method
sqlalchemy.events.DialectEvents.
do_execute(cursor: DBAPICursor, statement: str, parameters: _DBAPISingleExecuteParams, context: ExecutionContext) Optional[Literal[True]] ¶ Получите курсор для вызова execute().
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'do_execute') def receive_do_execute(cursor, statement, parameters, context): "listen for the 'do_execute' event" # ... (event handling logic) ...
Возвращает значение True, чтобы остановить дальнейшие вызовы событий и указать, что выполнение курсора уже произошло в обработчике события.
-
method
sqlalchemy.events.DialectEvents.
do_execute_no_params(cursor: DBAPICursor, statement: str, context: ExecutionContext) Optional[Literal[True]] ¶ Получите курсор, чтобы вызвать execute() без параметров.
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'do_execute_no_params') def receive_do_execute_no_params(cursor, statement, context): "listen for the 'do_execute_no_params' event" # ... (event handling logic) ...
Возвращает значение True, чтобы остановить дальнейшие вызовы событий и указать, что выполнение курсора уже произошло в обработчике события.
-
method
sqlalchemy.events.DialectEvents.
do_executemany(cursor: DBAPICursor, statement: str, parameters: _DBAPIMultiExecuteParams, context: ExecutionContext) Optional[Literal[True]] ¶ Получите курсор для вызова функции executemany().
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'do_executemany') def receive_do_executemany(cursor, statement, parameters, context): "listen for the 'do_executemany' event" # ... (event handling logic) ...
Возвращает значение True, чтобы остановить дальнейшие вызовы событий и указать, что выполнение курсора уже произошло в обработчике события.
-
method
sqlalchemy.events.DialectEvents.
do_setinputsizes(inputsizes: Dict[BindParameter[Any], Any], cursor: DBAPICursor, statement: str, parameters: _DBAPIAnyExecuteParams, context: ExecutionContext) None ¶ Получите словарь setinputsizes для возможной модификации.
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'do_setinputsizes') def receive_do_setinputsizes(inputsizes, cursor, statement, parameters, context): "listen for the 'do_setinputsizes' event" # ... (event handling logic) ...
Это событие возникает в том случае, если диалект использует метод DBAPI
cursor.setinputsizes()
, который передает информацию о привязке параметров для конкретного оператора. Данный словарьinputsizes
будет содержать объектыBindParameter
в качестве ключей, связанные с объектами типов, специфичных для DBAPI, в качестве значений; для параметров, которые не связаны, они добавляются в словарь сNone
в качестве значения, что означает, что параметр не будет включен в конечный вызов setinputsizes. Это событие может быть использовано для проверки и/или регистрации типов данных, которые связываются, а также для изменения словаря на месте. Параметры могут быть добавлены, изменены или удалены из этого словаря. Вызывающие обычно хотят проверить атрибутBindParameter.type
данных объектов bind, чтобы принять решение об объекте DBAPI.После события словарь
inputsizes
преобразуется в соответствующую структуру данных для передачи вcursor.setinputsizes
; либо список для позиционного стиля выполнения связанных параметров, либо словарь строковых ключей параметров к объектам типа DBAPI для именованного стиля выполнения связанных параметров.Хук setinputsizes в целом используется только для диалектов, которые включают флаг
use_setinputsizes=True
. Диалекты, использующие этот флаг, включают диалекты cx_Oracle, pg8000, asyncpg и pyodbc.Примечание
Для использования с pyodbc необходимо передать диалекту флаг
use_setinputsizes
, например:create_engine("mssql+pyodbc://...", use_setinputsizes=True)
См.также
Добавлено в версии 1.2.9.
-
method
sqlalchemy.events.DialectEvents.
handle_error(exception_context: ExceptionContext) Optional[BaseException] ¶ Перехватывать все исключения, обрабатываемые
Dialect
, обычно, но не ограничиваясь теми, которые испускаются в пределах области действияConnection
.Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeEngine, 'handle_error') def receive_handle_error(exception_context): "listen for the 'handle_error' event" # ... (event handling logic) ...
Изменено в версии 2.0: событие
DialectEvents.handle_error()
перемещено в классDialectEvents
из классаConnectionEvents
, чтобы оно также могло участвовать в операции «pre ping», настроенной с помощью параметраcreate_engine.pool_pre_ping
. Событие остается зарегистрированным при использованииEngine
в качестве цели события, однако обратите внимание, что использованиеConnection
в качестве цели события дляDialectEvents.handle_error()
больше не поддерживается.Сюда входят все исключения, выдаваемые DBAPI, а также в процессе вызова оператора SQLAlchemy, включая ошибки кодирования и другие ошибки проверки оператора. Другие области, в которых вызывается это событие, включают начало и конец транзакции, выборку строк результата, создание курсора.
Обратите внимание, что
handle_error()
может поддерживать новые виды исключений и новые сценарии вызова в любое время. Код, использующий это событие, должен ожидать появления новых сценариев вызова в младших релизах.Для поддержки широкого разнообразия членов, соответствующих исключению, а также для обеспечения расширяемости события без обратной несовместимости, единственным принимаемым аргументом является экземпляр
ExceptionContext
. Этот объект содержит члены данных, представляющие подробную информацию об исключении.Этот крючок поддерживает следующие варианты использования:
только для чтения, низкоуровневая обработка исключений для ведения журнала и отладки
Установление того, указывает ли сообщение об ошибке соединения DBAPI на то, что соединение с базой данных должно быть переподключено, в том числе для обработчика «pre_ping», используемого некоторыми диалектами
Установление или отключение того, что соединение или принадлежащий ему пул соединений аннулируется или истекает в ответ на определенное исключение
переписывание исключений
Хук вызывается, пока курсор из неудачной операции (если таковой имеется) все еще открыт и доступен. На этом курсоре могут быть вызваны специальные операции очистки; SQLAlchemy попытается закрыть этот курсор после вызова этого хука.
Начиная с версии SQLAlchemy 2.0, обработчик «pre_ping», включенный с помощью параметра
create_engine.pool_pre_ping
, также будет участвовать в процессеhandle_error()
, для тех диалектов, которые полагаются на коды разъединения для определения «живости» базы данных. Обратите внимание, что некоторые диалекты, такие как psycopg, psycopg2, и большинство диалектов MySQL используют собственный методping()
, предоставляемый DBAPI, который не использует коды разъединения.Изменено в версии 2.0.0: Крючок события
DialectEvents.handle_error()
участвует в операциях «предварительного пинга» пула соединений. При таком использовании атрибутExceptionContext.engine
будетNone
, однако используемыйDialect
всегда доступен через атрибутExceptionContext.dialect
.Изменено в версии 2.0.5: Добавлен атрибут
ExceptionContext.is_pre_ping
, который будет установлен вTrue
при срабатывании крючка событияDialectEvents.handle_error()
в рамках операции предварительного пинга пула соединений.Изменено в версии 2.0.5: Устранена проблема, которая позволяет драйверам PostgreSQL
psycopg
иpsycopg2
, а также всем драйверам MySQL, правильно участвовать в подключении событияDialectEvents.handle_error()
во время операций «pre-ping» пула соединений; ранее реализация была нерабочей для этих драйверов.Функция-обработчик имеет два варианта замены исключения, созданного SQLAlchemy, на исключение, определенное пользователем. Она может либо непосредственно вызвать это новое исключение, в этом случае все дальнейшие слушатели событий будут обойдены, и исключение будет вызвано после соответствующей очистки:
@event.listens_for(Engine, "handle_error") def handle_exception(context): if isinstance(context.original_exception, psycopg2.OperationalError) and \ "failed" in str(context.original_exception): raise MySpecialException("failed operation")
Предупреждение
Поскольку событие
DialectEvents.handle_error()
специально предусматривает повторное отбрасывание исключений в качестве конечного исключения, вызванного неудачным оператором, трассировка стека будет вводить в заблуждение, если сам пользовательский обработчик события не сработает и выбросит неожиданное исключение; трассировка стека может не показать фактическую строку кода, в которой произошел сбой! В этом случае рекомендуется писать код осторожно и использовать протоколирование и/или встроенную отладку, если возникают неожиданные исключения.В качестве альтернативы можно использовать «цепной» стиль обработки событий, настроив обработчик с модификатором
retval=True
и вернув новый экземпляр исключения из функции. В этом случае обработка события будет продолжена следующим обработчиком. «Цепочечное» исключение доступно с помощьюExceptionContext.chained_exception
:@event.listens_for(Engine, "handle_error", retval=True) def handle_exception(context): if context.chained_exception is not None and \ "special" in context.chained_exception.message: return MySpecialException("failed", cause=context.chained_exception)
Обработчики, возвращающие
None
, могут использоваться внутри цепочки; когда обработчик возвращаетNone
, предыдущий экземпляр исключения, если таковой имеется, сохраняется в качестве текущего исключения, которое передается в следующий обработчик.Когда пользовательское исключение поднимается или возвращается, SQLAlchemy поднимает это новое исключение как есть, оно не оборачивается никаким объектом SQLAlchemy. Если исключение не является подклассом
sqlalchemy.exc.StatementError
, некоторые функции могут быть недоступны; в настоящее время это включает функцию ORM по добавлению детальной подсказки об «autoflush» к исключениям, поднятым в процессе autoflush.- Параметры:
context – объект
ExceptionContext
. Подробную информацию о всех доступных членах смотрите в этом классе.
-
attribute
События схемы¶
Object Name | Description |
---|---|
Определите слушателей событий для объектов схемы, то есть |
|
Базовый класс для элементов, которые являются целями событий |
- class sqlalchemy.events.DDLEvents¶
Определите слушателей событий для объектов схемы, то есть
SchemaItem
и других подклассовSchemaEventTarget
, включаяMetaData
,Table
,Column
и т.д.Создание / сброс событий
События, возникающие при передаче в базу данных команд CREATE и DROP. К крючкам событий в этой категории относятся
DDLEvents.before_create()
,DDLEvents.after_create()
,DDLEvents.before_drop()
иDDLEvents.after_drop()
.Эти события испускаются при использовании методов уровня схемы, таких как
MetaData.create_all()
иMetaData.drop_all()
. Методы создания/удаления каждого объекта, такие какTable.create()
,Table.drop()
,Index.create()
, также включены, как и специфические для диалекта методы, такие какENUM.create()
.Добавлено в версии 2.0: Крючки событий
DDLEvents
теперь выполняются для объектов, не относящихся к таблицам, включая ограничения, индексы и специфические для диалекта типы схем.Крючки событий могут быть присоединены непосредственно к объекту
Table
или коллекцииMetaData
, а также к любому классу или объектуSchemaItem
, который может быть индивидуально создан и удален с помощью отдельной команды SQL. К таким классам относятсяIndex
,Sequence
и специфические для диалекта классы, такие какENUM
.Пример использования события
DDLEvents.after_create()
, где пользовательский крючок события будет выдавать командуALTER TABLE
на текущем соединении, после того как будет выдана командаCREATE TABLE
:from sqlalchemy import create_engine from sqlalchemy import event from sqlalchemy import Table, Column, Metadata, Integer m = MetaData() some_table = Table('some_table', m, Column('data', Integer)) @event.listens_for(some_table, "after_create") def after_create(target, connection, **kw): connection.execute(text( "ALTER TABLE %s SET name=foo_%s" % (target.name, target.name) )) some_engine = create_engine("postgresql://scott:tiger@host/test") # will emit "CREATE TABLE some_table" as well as the above # "ALTER TABLE" statement afterwards m.create_all(some_engine)
Объекты ограничений, такие как
ForeignKeyConstraint
,UniqueConstraint
,CheckConstraint
, также могут быть подписаны на эти события, однако они не обычно производят события, так как эти объекты обычно отображаются в строку в рамках оператораCREATE TABLE
и неявно выпадают из оператораDROP TABLE
.Для конструкции
Index
событие hook будет выдано дляCREATE INDEX
, однако SQLAlchemy обычно не выдаетDROP INDEX
при сбросе таблиц, так как это опять же подразумевается в оператореDROP TABLE
.Добавлено в версии 2.0: Поддержка объектов
SchemaItem
для событий create/drop была расширена с прежней поддержкиMetaData
иTable
доConstraint
и всех подклассов,Index
,Sequence
и некоторых связанных с типом конструкций, таких какENUM
.Примечание
Эти крючки событий испускаются только в рамках методов SQLAlchemy create/drop; они не обязательно поддерживаются такими инструментами, как alembic.
События
События вложения предоставляются для настройки поведения всякий раз, когда дочерний элемент схемы связан с родительским, например, когда
Column
связан с егоTable
, когдаForeignKeyConstraint
связан сTable
и т.д. К таким событиям относятсяDDLEvents.before_parent_attach()
иDDLEvents.after_parent_attach()
.Мероприятия для размышления
Событие
DDLEvents.column_reflect()
используется для перехвата и изменения in-Python определения столбцов базы данных, когда происходит reflection таблиц базы данных.Использование с Generic DDL
События DDL тесно интегрируются с классом
DDL
и иерархиейExecutableDDLElement
конструкций пунктов DDL, которые сами по себе подходят в качестве вызываемых слушателей:from sqlalchemy import DDL event.listen( some_table, "after_create", DDL("ALTER TABLE %(table)s SET name=foo_%(table)s") )
** Распространение событий на копии метаданных**.
Для всех событий
DDLEvent
аргумент ключевого словаpropagate=True
обеспечит распространение обработчика данного события на копии объекта, которые создаются при использовании методаTable.to_metadata()
:from sqlalchemy import DDL metadata = MetaData() some_table = Table("some_table", metadata, Column("data", Integer)) event.listen( some_table, "after_create", DDL("ALTER TABLE %(table)s SET name=foo_%(table)s"), propagate=True ) new_metadata = MetaData() new_table = some_table.to_metadata(new_metadata)
Указанный выше объект
DDL
будет связан с событиемDDLEvents.after_create()
как для объектаsome_table
, так и для объектаnew_table
Table
.Members
after_create(), after_drop(), after_parent_attach(), before_create(), before_drop(), before_parent_attach(), column_reflect(), dispatch
Классная подпись
класс
sqlalchemy.events.DDLEvents
(sqlalchemy.event.Events
)-
method
sqlalchemy.events.DDLEvents.
after_create(target: SchemaEventTarget, connection: Connection, **kw: Any) None ¶ Вызывается после выполнения операторов CREATE.
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeSchemaClassOrObject, 'after_create') def receive_after_create(target, connection, **kw): "listen for the 'after_create' event" # ... (event handling logic) ...
- Параметры:
target –
SchemaObject
, напримерMetaData
илиTable
, но также включая все объекты create/drop, такие какIndex
,Sequence
и т.д., объект, который является целью события. … версия добавлена:: 2.0 Добавлена поддержка всех объектовSchemaItem
.connection –
Connection
, где был выпущен оператор или операторы CREATE.**kw – дополнительные аргументы ключевых слов, относящиеся к событию. Содержимое этого словаря может отличаться в разных выпусках и включать список таблиц, создаваемых для события на уровне метаданных, флаг checkfirst и другие элементы, используемые внутренними событиями.
listen()
также принимает модификаторpropagate=True
для этого события; при значении True функция слушателя будет установлена для всех копий, созданных для целевого объекта, т.е. тех копий, которые создаются при использованииTable.to_metadata()
.
-
method
sqlalchemy.events.DDLEvents.
after_drop(target: SchemaEventTarget, connection: Connection, **kw: Any) None ¶ Вызывается после испускания операторов DROP.
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeSchemaClassOrObject, 'after_drop') def receive_after_drop(target, connection, **kw): "listen for the 'after_drop' event" # ... (event handling logic) ...
- Параметры:
target –
SchemaObject
, напримерMetaData
илиTable
, но также включая все объекты create/drop, такие какIndex
,Sequence
и т.д., объект, который является целью события. … версия добавлена:: 2.0 Добавлена поддержка всех объектовSchemaItem
.connection –
Connection
, где был выпущен оператор или операторы DROP.**kw – дополнительные аргументы ключевых слов, относящиеся к событию. Содержимое этого словаря может отличаться в разных выпусках и включать список таблиц, создаваемых для события на уровне метаданных, флаг checkfirst и другие элементы, используемые внутренними событиями.
listen()
также принимает модификаторpropagate=True
для этого события; при значении True функция слушателя будет установлена для всех копий, созданных для целевого объекта, т.е. тех копий, которые создаются при использованииTable.to_metadata()
.
-
method
sqlalchemy.events.DDLEvents.
after_parent_attach(target: SchemaEventTarget, parent: SchemaItem) None ¶ Вызывается после того, как
SchemaItem
ассоциируется с родительскимSchemaItem
.Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeSchemaClassOrObject, 'after_parent_attach') def receive_after_parent_attach(target, parent): "listen for the 'after_parent_attach' event" # ... (event handling logic) ...
- Параметры:
target – целевой объект
parent – родитель, к которому присоединяется цель.
listen()
также принимает модификаторpropagate=True
для этого события; при значении True функция слушателя будет установлена для всех копий, созданных для целевого объекта, т.е. тех копий, которые создаются при использованииTable.to_metadata()
.
-
method
sqlalchemy.events.DDLEvents.
before_create(target: SchemaEventTarget, connection: Connection, **kw: Any) None ¶ Вызывается перед выполнением операторов CREATE.
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeSchemaClassOrObject, 'before_create') def receive_before_create(target, connection, **kw): "listen for the 'before_create' event" # ... (event handling logic) ...
- Параметры:
target –
SchemaObject
, напримерMetaData
илиTable
, но также включая все объекты create/drop, такие какIndex
,Sequence
и т.д., объект, который является целью события. … версия добавлена:: 2.0 Добавлена поддержка всех объектовSchemaItem
.connection –
Connection
, где будет выдан оператор или операторы CREATE.**kw – дополнительные аргументы ключевых слов, относящиеся к событию. Содержимое этого словаря может отличаться в разных выпусках и включать список таблиц, создаваемых для события на уровне метаданных, флаг checkfirst и другие элементы, используемые внутренними событиями.
listen()
принимает модификаторpropagate=True
для этого события; когда True, функция слушателя будет установлена для всех копий целевого объекта, т.е. тех копий, которые создаются при использованииTable.to_metadata()
.listen()
принимает модификаторinsert=True
для этого события; при значении True функция слушателя будет добавлена во внутренний список событий при обнаружении и будет выполняться перед зарегистрированными функциями слушателя, которые не передают этот аргумент.
-
method
sqlalchemy.events.DDLEvents.
before_drop(target: SchemaEventTarget, connection: Connection, **kw: Any) None ¶ Вызывается перед выпуском операторов DROP.
Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeSchemaClassOrObject, 'before_drop') def receive_before_drop(target, connection, **kw): "listen for the 'before_drop' event" # ... (event handling logic) ...
- Параметры:
target –
SchemaObject
, напримерMetaData
илиTable
, но также включая все объекты create/drop, такие какIndex
,Sequence
и т.д., объект, который является целью события. … версия добавлена:: 2.0 Добавлена поддержка всех объектовSchemaItem
.connection –
Connection
, где будет выдан оператор или операторы DROP.**kw – дополнительные аргументы ключевых слов, относящиеся к событию. Содержимое этого словаря может отличаться в разных выпусках и включать список таблиц, создаваемых для события на уровне метаданных, флаг checkfirst и другие элементы, используемые внутренними событиями.
listen()
также принимает модификаторpropagate=True
для этого события; при значении True функция слушателя будет установлена для всех копий, созданных для целевого объекта, т.е. тех копий, которые создаются при использованииTable.to_metadata()
.
-
method
sqlalchemy.events.DDLEvents.
before_parent_attach(target: SchemaEventTarget, parent: SchemaItem) None ¶ Вызывается перед тем, как
SchemaItem
ассоциируется с родительскимSchemaItem
.Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeSchemaClassOrObject, 'before_parent_attach') def receive_before_parent_attach(target, parent): "listen for the 'before_parent_attach' event" # ... (event handling logic) ...
- Параметры:
target – целевой объект
parent – родитель, к которому присоединяется цель.
listen()
также принимает модификаторpropagate=True
для этого события; при значении True функция слушателя будет установлена для всех копий, созданных для целевого объекта, т.е. тех копий, которые создаются при использованииTable.to_metadata()
.
-
method
sqlalchemy.events.DDLEvents.
column_reflect(inspector: Inspector, table: Table, column_info: ReflectedColumn) None ¶ Вызывается для каждой единицы „column info“, полученной при отражении
Table
.Примерные формы аргументов:
from sqlalchemy import event @event.listens_for(SomeSchemaClassOrObject, 'column_reflect') def receive_column_reflect(inspector, table, column_info): "listen for the 'column_reflect' event" # ... (event handling logic) ...
Это событие легче всего использовать, применяя его к определенному экземпляру
MetaData
, где оно будет действовать для всехTable
объектов в пределах этогоMetaData
, которые подвергаются отражению:metadata = MetaData() @event.listens_for(metadata, 'column_reflect') def receive_column_reflect(inspector, table, column_info): # receives for all Table objects that are reflected # under this MetaData # will use the above event hook my_table = Table("my_table", metadata, autoload_with=some_engine)
Добавлено в версии 1.4.0b2: Теперь хук
DDLEvents.column_reflect()
можно применять как к объектуMetaData
, так и к самому классуMetaData
, где он будет действовать для всех объектовTable
, связанных с целевымMetaData
.Его также можно применить к классу
Table
повсеместно:from sqlalchemy import Table @event.listens_for(Table, 'column_reflect') def receive_column_reflect(inspector, table, column_info): # receives for all Table objects that are reflected
Его также можно применить к конкретному
Table
в тот момент, когда он отражается, используя параметрTable.listeners
:t1 = Table( "my_table", autoload_with=some_engine, listeners=[ ('column_reflect', receive_column_reflect) ] )
Словарь информации о столбцах, возвращаемый диалектом, передается и может быть изменен. Словарь является тем, что возвращается в каждом элементе списка, возвращаемого командой
Inspector.get_columns()
:name
- имя колонки, применяется к параметруColumn.name
type
- тип этого столбца, который должен быть экземпляромTypeEngine
, применяется к параметруColumn.type
nullable
- булев флаг, если колонка является NULL или NOT NULL, применяется к параметруColumn.nullable
default
- серверное значение столбца по умолчанию. Обычно это значение задается как обычное строковое SQL-выражение, однако событие может передавать и объектFetchedValue
,DefaultClause
илиtext()
. Применяется к параметруColumn.server_default
.
Событие вызывается перед выполнением любого действия над этим словарем, и его содержимое может быть изменено; следующие дополнительные ключи могут быть добавлены в словарь для дальнейшего изменения того, как строится
Column
:key
- строковый ключ, который будет использоваться для доступа к данномуColumn
в коллекции.c
; будет применен к параметруColumn.key
. Также используется для отображения ORM. Пример см. в разделе Автоматизация схем именования столбцов из отраженных таблиц.quote
- принудительное или не принудительное цитирование имени столбца; применяется к параметруColumn.quote
.info
- словарь произвольных данных, которые будут следовать вместе сColumn
, применяется к параметруColumn.info
.
listen()
также принимает модификаторpropagate=True
для этого события; при значении True функция слушателя будет установлена для всех копий, созданных для целевого объекта, т.е. тех копий, которые создаются при использованииTable.to_metadata()
.См.также
Автоматизация схем именования столбцов из отраженных таблиц - в документации по отображению ORM
Определения перехватывающих колонок - в документации Automap
Отражение с помощью типов, не зависящих от базы данных - в документации Отражение объектов базы данных
-
attribute
sqlalchemy.events.DDLEvents.
dispatch: _Dispatch[_ET] = <sqlalchemy.event.base.DDLEventsDispatch object>¶ ссылка обратно на класс _Dispatch.
Двунаправленный по отношению к _Dispatch._events
-
method
- class sqlalchemy.events.SchemaEventTarget¶
Базовый класс для элементов, которые являются целями событий
DDLEvents
.Это включает в себя
SchemaItem
, а такжеSchemaType
.Классная подпись
класс
sqlalchemy.events.SchemaEventTarget
(sqlalchemy.event.registry.EventTarget
)