Метод inline класса Insert
Метод inline класса Insert указывает
SQLAlchemy включить возврат значений прямо
в основной INSERT-запрос. Метод не принимает
параметров и возвращает новый объект
Insert с установленным флагом
inline. Такой подход позволяет получить
сгенерированные значения (например,
id) в одном запросе, без выполнения
дополнительного SELECT. Это особенно удобно
для СУБД, которые поддерживают конструкцию
RETURNING, например PostgreSQL.
Синтаксис
insert(table).inline()
Пример
Давайте создадим таблицу articles
и выполним вставку с методом inline,
чтобы получить сгенерированный
идентификатор:
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)
)
metadata.create_all(engine)
with engine.connect() as conn:
stmt = insert(articles).inline().values(
title='article',
text='some text'
)
res = conn.execute(stmt)
print(res.inserted_primary_key)
Результат выполнения кода:
(1,)
Пример
Давайте сравним поведение метода inline
при вставке нескольких строк и выведем
список полученных идентификаторов:
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)
)
metadata.create_all(engine)
with engine.connect() as conn:
stmt = insert(articles).inline()
res = conn.execute(stmt, [
{'title': 'article 1', 'text': 'text 1'},
{'title': 'article 2', 'text': 'text 2'},
{'title': 'article 3', 'text': 'text 3'}
])
print(res.inserted_primary_key_rows)
Результат выполнения кода:
[(1,), (2,), (3,)]
Пример
Давайте используем метод inline
вместе с методом returning для
получения значения колонки title
из вставленной строки:
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)
)
metadata.create_all(engine)
with engine.connect() as conn:
stmt = insert(articles).inline().returning(articles.c.title)
res = conn.execute(stmt, {'title': 'article', 'text': 'some text'})
print(res.fetchall())
Результат выполнения кода:
[('article',)]
Смотрите также
-
класс
Insert,
который представляет INSERT-запрос -
метод
values,
который задает значения для вставки -
метод
returning,
который указывает возвращаемые колонки -
метод
from_select,
который вставляет данные из SELECT-запроса