Pandas read_sql_query查询VARCHAR列WHERE条件报错解决方案
varchar字段条件查询报列名无效的原因及修复方案
问题原因
SQL语法对不同类型的常量书写规则有强制要求:
- 数值类型(整型、浮点型等)的常量不需要额外符号包裹,直接写值即可,因此对整型字段
Price执行Price = 1的查询可以正常运行,解析引擎能正确识别1是要匹配的数值。 - 字符类型(varchar、char、text等)的常量必须用单引号包裹,否则SQL解析引擎会把等号后未加引号的
Daily识别为列名,而非要匹配的字符串值,最终触发「列名无效」的报错。
修复方法
给要匹配的字符串值加上单引号即可,修正后的代码有两种常见写法:
- 转义单引号写法,保持SQL语句外层用单引号包裹,内部字符串的单引号用反斜杠转义:
df = pd.read_sql_query('SELECT * FROM Prices where Type = \'Daily\'', conn)
- 外层SQL用双引号包裹,内部字符串直接写单引号,不需要转义,可读性更好:
df = pd.read_sql_query("SELECT * FROM Prices where Type = 'Daily'", conn)
额外注意事项
如果后续需要动态传入不同的Type值做查询,不要手动拼接字符串,用read_sql_query自带的params参数传参,避免SQL注入风险,示例如下:
# 动态传参写法,更安全 query_type = "Daily" df = pd.read_sql_query( "SELECT * FROM Prices where Type = %s", conn, params=(query_type,) )
如果加完单引号仍然提示字段相关错误,可以根据使用的数据库类型给字段名加标识符包裹:比如SQL Server用方括号包裹为[Type],MySQL用反引号包裹为`Type`,避免字段名和数据库保留字冲突。
内容的提问来源于stack exchange,提问作者AVad
相关产品推荐
相关产品推荐

