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

Python变量用于SQL查询时触发TypeError问题排查

解决Python执行SQL查询时的TypeError错误

问题场景

我想用Python编写SQL查询,通过用户输入补全查询条件,但运行代码时触发了TypeError错误,以下是完整报错信息及代码:

报错信息

Traceback (most recent call last):
File "C:\Users\mberardi\Documents\python scripts\print-eforming-stats.py", line 39, in 
DF = pd.read_sql_query(query,conn)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\mberardi\AppData\Local\anaconda3\Lib\site-packages\pandas\io\sql.py", line 486, in read_sql_query
return pandas_sql.read_query(
^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\mberardi\AppData\Local\anaconda3\Lib\site-packages\pandas\io\sql.py", line 2328, in read_query
cursor = self.execute(sql, params)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\mberardi\AppData\Local\anaconda3\Lib\site-packages\pandas\io\sql.py", line 2260, in execute
raise TypeError("Query must be a string unless using sqlalchemy.")
TypeError: Query must be a string unless using sqlalchemy.

原代码

import pyodbc
from datetime import datetime
import pandas as pd

def today():
    return datetime.now().strftime('%Y-%m-%d')
##    return (datetime.now()+timedelta(days=1)).strftime('%Y-%m-%d')


#create connection string
conn = pyodbc.connect('Driver={SQL Server};'
                      'Server=OPTSAPPS02,1433\\SQLEXPRESS;'
                      'Database=OPTS Production Tracking Service;'
                      'UID=fetch;'
                      'PWD=Reader123')

cursor = conn.cursor()

#create query parameter for target
targetDTString = today()+' 23:59'
targetDate = datetime.strptime(targetDTString,'%Y-%m-%d %H:%M')

###FIND A WAY TO TAKE INPUT FOR QUERY AND MAKE IT SO YOU CAN SEARCH/FILTER BY MOTHER AND STAMPER NUMBER####

query = cursor.execute("""SELECT TOOL_OUT, TANK, STATION, FORMING_CURRENT, TIME, BUILDING_CURRENT, CYCLE_TIME FROM ELECTROFORMING
    WHERE PROCESS='ELECTROFORMING' AND (TOOL_OUT=?)""", (input("TOOL_OUT: ")))
    
DF = pd.read_sql_query(query,conn)
print(DF)

错误原因

  1. 参数类型不匹配:pd.read_sql_query()要求第一个参数是字符串格式的SQL语句,但你传入的是cursor.execute()返回的cursor对象,不符合函数参数要求,触发TypeError。
  2. 参数传递格式错误:cursor.execute()的第二个参数如果是单个值,(input("TOOL_OUT: "))不会被识别为元组,必须写成(input("TOOL_OUT: "),)(末尾加逗号)才能正确传递参数。

修复方案

推荐直接使用pd.read_sql_query()带参数查询,无需手动操作cursor,代码更简洁规范:

修复后的完整代码

import pyodbc
from datetime import datetime
import pandas as pd

def today():
    return datetime.now().strftime('%Y-%m-%d')


# 创建数据库连接
conn = pyodbc.connect('Driver={SQL Server};'
                      'Server=OPTSAPPS02,1433\\SQLEXPRESS;'
                      'Database=OPTS Production Tracking Service;'
                      'UID=fetch;'
                      'PWD=Reader123')

# 获取用户输入的查询条件
tool_out_input = input("TOOL_OUT: ")

# 定义SQL查询语句(字符串格式)
sql_query = """SELECT TOOL_OUT, TANK, STATION, FORMING_CURRENT, TIME, BUILDING_CURRENT, CYCLE_TIME 
               FROM ELECTROFORMING
               WHERE PROCESS='ELECTROFORMING' AND TOOL_OUT=?"""

# 使用pandas执行带参数的查询,params传入单元素元组(注意末尾逗号)
DF = pd.read_sql_query(sql_query, conn, params=(tool_out_input,))

# 打印结果
print(DF)

# 关闭数据库连接,释放资源
conn.close()

关键修改说明

  • 将SQL语句单独定义为字符串变量,符合pd.read_sql_query()的参数要求
  • 通过params参数传递查询条件,单元素元组末尾的逗号确保参数被正确识别
  • 移除多余的cursor.execute()调用,避免逻辑混淆
  • 添加连接关闭操作,养成良好的资源管理习惯

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 19:12:52