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
相关产品推荐
相关产品推荐

