You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PYODBC连接ERP ODBC报错:TypeError: execute首参需为字符串/Unicode查询

解决PYODBC执行SQL时的TypeError问题

嘿,我一眼就瞅出你代码里的问题啦——你错误地把cursor.tables()返回的row对象传给了execute()方法,而这个方法要求第一个参数必须是合法的SQL字符串,这直接触发了TypeError: the first argument to execute must be a string or unicode query报错。

问题出在哪?

你这段代码里的逻辑有明显问题:

for row in cursor.tables(tableType='TABLE'):
 print(row)
sql = """SELECT * FROM ETL.Dim_FC_UPS_Interface_Detail"""
cursor.execute(row, sql)

这里的row是cursor.tables()返回的表元数据对象(里面存着表名、所属schema这类信息),根本不是SQL语句,把它传给execute()肯定会报错呀!而且你后面已经定义了正确的sql变量,完全不需要用到这个row。

修正后的代码

把错误的cursor.execute(row, sql)删掉就行,甚至如果只是要把数据读到Pandas里,连手动调用cursor.execute都不需要——pd.read_sql()会自动帮你处理连接和执行逻辑:

import pyodbc
import pandas as pd

# 建立数据库连接
conn = pyodbc.connect(
 'DRIVER={SQL Server};'
 'SERVER=192.168.1.30;'
 'DATABASE=Datamart;'
 'Trusted_Connection=yes;')

# 如果你只是想查看所有表,这段循环可以保留(和查询数据的逻辑分开)
cursor = conn.cursor()
for row in cursor.tables(tableType='TABLE'):
 print(row)

# 正确执行查询并读取到DataFrame
sql = """SELECT * FROM ETL.Dim_FC_UPS_Interface_Detail"""
# 如果你非要手动用cursor执行(其实没必要),应该这么写:
# cursor.execute(sql)
df = pd.read_sql(sql, conn)
print(df.head())

# 最后记得关闭连接,养成好习惯
conn.close()

额外提醒

你之前尝试的.decode('utf-8')其实完全不对症,这次的错误根本不是编码问题,是参数类型传错了。另外pd.read_sql()已经封装了执行查询和读取结果的流程,日常用这个就足够啦。

内容的提问来源于stack exchange,提问作者David Han

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:54:48