Поскольку это лучший результат в Google по этому распространенному вопросу, и на самом деле существует гораздо лучшее решение, вот обновленный ответ. Вы можете использовать метод Insert.from_select(). Хотя его трудно найти, он задокументирован здесь.
Быстрый учебник
При работе с объектами Table вы можете использовать что-то вроде:
>>> from sqlalchemy.sql import select
>>> stmt = TargetTable.insert().from_select([TargetTable.c.user_id, TargetTable.c.user_name],
select([SrcTable.c.user_id, SrcTable.c.user_name]))
>>> print(stmt)
INSERT INTO "TargetTable" (user_id, user_name) SELECT "SrcTable".user_id, "SrcTable".user_name
FROM "SrcTable"
Наконец, выполните с engine.execute(stmt) или подобным.
Окончательный выходной оператор компилируется SQLAlchemy в зависимости от диалекта, используемого в движке. Здесь я использовал диалект SQLite.
Это успешно позволяет избежать загрузки каких-либо данных в объекты Python, и позволяет механизму базы данных эффективно обрабатывать все. Ура!
В отличие от использования текстовых операторов SQL с text() этот метод также независим от СУБД, поскольку он по-прежнему использует язык выражений SQLAlchemy, как описано здесь. Этот язык обеспечивает компиляцию на правильный диалект при выполнении.
Использование ORM-таблиц
Исходный вопрос указывает на вариант использования, когда ORM используется для взаимодействия с базой данных. Вы, вероятно, также определили свои таблицы, используя базу ORM. Метаданные, хранящиеся в этих объектах, теперь работают немного по-другому. Поэтому немного изменим пример:
>>> from sqlalchemy.sql import select, insert
>>> stmt = insert(TargetTable).from_select([TargetTable.user_id, TargetTable.user_name],
select([SrcTable.user_id, SrcTable.user_name]))
>>> engine.execute(stmt)
INFO sqlalchemy.engine.base.Engine INSERT INTO "TargetTable" (user_id, user_name) SELECT "SrcTable".user_id, "SrcTable".user_name
FROM "SrcTable"
Ну посмотри на это. На самом деле это даже сделало его немного проще.
И это будет намного быстрее.
P.S. Вот еще один секрет из документов. Хотите использовать операторы sql WITH таким же динамическим образом? Вы можете сделать это с помощью "CTE"
person
Trezorro
schedule
10.04.2020