Метод from_select класса Insert
Метод from_select класса Insert создает
INSERT-запрос, данные для которого берутся из
результата другого SELECT-запроса. Это удобно,
когда требуется перенести данные из одной таблицы
в другую без промежуточной загрузки в Python.
Первым параметром передается список имен целевых
колонок, вторым - объект SELECT-запроса.
Синтаксис
Insert.from_select(names, select)
Пример
Давайте создадим две таблицы: articles и
articles_archive. С помощью
from_select перенесем строки из первой
таблицы во вторую:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
from sqlalchemy import insert, select
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('text', String)
)
articles_archive = Table(
'articles_archive', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('text', String)
)
metadata.create_all(engine)
with engine.begin() as conn:
conn.execute(
insert(articles),
[
{'id': 1, 'title': 'article 1', 'text': 'text 1'},
{'id': 2, 'title': 'article 2', 'text': 'text 2'}
]
)
select_stmt = select(articles.c.id, articles.c.title, articles.c.text)
insert_stmt = insert(articles_archive).from_select(
['id', 'title', 'text'],
select_stmt
)
with engine.begin() as conn:
conn.execute(insert_stmt)
with engine.connect() as conn:
res = conn.execute(select(articles_archive)).fetchall()
print(res)
Результат выполнения кода:
[(1, 'article 1', 'text 1'), (2, 'article 2', 'text 2')]
Пример
Давайте посмотрим итоговый SQL-запрос, который
генерирует метод from_select:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
from sqlalchemy import insert, select
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String)
)
articles_archive = Table(
'articles_archive', metadata,
Column('id', Integer, primary_key=True),
Column('title', String)
)
select_stmt = select(articles.c.id, articles.c.title)
insert_stmt = insert(articles_archive).from_select(
['id', 'title'],
select_stmt
)
print(insert_stmt)
Итоговый SQL запрос:
INSERT INTO articles_archive (id, title) SELECT articles.id, articles.title FROM articles