如何使用 SQLAlchemy from_select 插入到选择中?

Posted

技术标签:

【中文标题】如何使用 SQLAlchemy from_select 插入到选择中?【英文标题】:How to do Insert Into Select With SQLAlchemy from_select? 【发布时间】:2019-05-31 19:41:55 【问题描述】:

我在使用 SQLAlchemy 中的 from_select 构造时遇到了麻烦。我似乎无法正确使用“SELECT *”的语法。我见过的每个示例都显示了明确的列名。我的问题在于下面的行,我只是无法正确使用语法:

meta.tables['XXXX'].insert().from_select(['*'],local_result)

我看到了一个像下面这样的例子,但由于某种原因我不能把它翻译成选择 *:

sel = select([table1.c.a, table1.c.b]).where(table1.c.c > 5)
ins = table2.insert().from_select(['a', 'b'], sel)

谢谢!

import urllib
import pyodbc
from sqlalchemy import create_engine
from sqlalchemy import MetaData
from sqlalchemy import Table
from sqlalchemy import select
from sqlalchemy import or_

local_params = urllib.parse.quote_plus("DRIVER=SQL Server;SERVER=XXX;DATABASE=XXX;Trusted_Connection=yes")
local_engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % local_params)
local_conn = local_engine.connect()
local_result = local_conn.execute("select * from dbo.XXX")

cloud_params = urllib.parse.quote_plus("DRIVER=ODBC Driver 17 for SQL Server;SERVER=XXXXX;DATABASE=XXXX;UID=XXXX;PWD=XXXX")
cloud_engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % cloud_params)
cloud_conn = cloud_engine.connect()

meta = MetaData()
meta.reflect(bind=cloud_conn)

meta.tables['XXXX'].insert().from_select(['*'],local_result)

#Tried This Also But Doesn't Work
#cloud_conn.execute(meta.tables['XXXX'].insert().from_select(['*'],local_result))

local_conn.close()
local_result.close()
cloud_conn.close()

我得到错误:

sqlalchemy.exc.ArgumentError: FROM expression expected

【问题讨论】:

你可以通过editing它为你的问题添加完整的堆栈跟踪吗? 【参考方案1】:

您可以使用 .keys() 来获取 select 语句的所有列:

cloud_conn.execute(meta.tables['XXXX'].insert().from_select(local_result.keys(),local_result))

【讨论】:

以上是关于如何使用 SQLAlchemy from_select 插入到选择中?的主要内容,如果未能解决你的问题,请参考以下文章

Flask 如何使用 SQLAlchemy 框架

如何使用 SQLAlchemy 创建 SQL 视图?

如何禁用SQLAlchemy缓存?

如何在 SQLAlchemy 中使用 UUID?

使用 sqlalchemy 时如何选择特定列?

如何使用 SQLAlchemy 插入数据