Метод execution_options класса Insert
Метод execution_options класса Insert
задает параметры выполнения для конкретного
INSERT-запроса. Он принимает именованные
аргументы, которые влияют на то, как диалект
СУБД выполнит вставку данных. Метод возвращает
новый объект Insert с обновленными
опциями, поэтому его можно вызывать в цепочке
с другими методами.
Наиболее часто используемыми опциями являются
synchronize_session для ORM-вставок и
populate_existing. Параметры
execution_options не сохраняются в
самом объекте запроса навсегда, а применяются
только к текущему выполнению.
Синтаксис
insert(table).execution_options(**kwargs)
Пример
Давайте создадим таблицу и выполним вставку с
опцией synchronize_session:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
from sqlalchemy import insert
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('text', String),
Column('status', String),
Column('num', Integer)
)
metadata.create_all(engine)
stmt = insert(articles).values(
title='article',
text='article text',
status='draft',
num=1
).execution_options(synchronize_session='fetch')
with engine.connect() as conn:
res = conn.execute(stmt)
print(res.inserted_primary_key)
Результат выполнения кода:
[1]
Пример
Давайте передадим несколько опций одновременно,
включая populate_existing:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
from sqlalchemy import insert
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('text', String),
Column('status', String),
Column('num', Integer)
)
metadata.create_all(engine)
stmt = insert(articles).values(
title='article',
text='article text',
status='published',
num=2
).execution_options(
synchronize_session='evaluate',
populate_existing=True
)
with engine.connect() as conn:
res = conn.execute(stmt)
print(res.inserted_primary_key)
Результат выполнения кода:
[1]
Пример
Давайте убедимся, что метод возвращает новый
объект Insert, а исходный запрос
остается без изменений:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
from sqlalchemy import insert
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('text', String),
Column('status', String),
Column('num', Integer)
)
metadata.create_all(engine)
base_stmt = insert(articles).values(
title='article',
text='article text',
status='draft',
num=3
)
opts_stmt = base_stmt.execution_options(synchronize_session='fetch')
print(base_stmt is opts_stmt)
print(base_stmt._execution_options)
print(opts_stmt._execution_options)
Результат выполнения кода:
False
immutabledict({})
immutabledict({'synchronize_session': 'fetch'})
Смотрите также
-
класс
Insert,
который представляет INSERT-запрос -
метод
values,
который задает вставляемые значения -
метод
returning,
который возвращает вставленные строки -
метод
prefix_with,
который добавляет префикс к INSERT-запросу