使用Pandas执行SQL查询报错,相同逻辑用Cursor可正常运行
Pandas read_sql 字符串参数查询报错解决办法
问题场景
使用Pandas的read_sql查询字符串类型参数时触发错误,但用原生Cursor执行相同逻辑正常,查询数值类型参数也无问题。
错误代码:
import pandas as pd data_BG2= pd.read_sql("SELECT * FROM [dbo].[Bullgear geometry] WHERE [Bullgear]=?", "3810907-01110", cnxn)
(注:cnxn为已建立的数据库连接对象)
报错信息:
ArgumentError: Could not parse rfc1738 URL from string '3810907-01110'
对比正常运行的Cursor代码:
cursor=cnxn.cursor() cursor.execute("SELECT * FROM [dbo].[Bullgear geometry] WHERE [Bullgear]=?","3810907-01110") for i in cursor: print (i)
错误原因
read_sql的参数顺序与cursor.execute不同:read_sql的第二个参数要求传入数据库连接对象,你误将查询参数"3810907-01110"放在了这个位置,导致Pandas把它当成数据库连接URL解析,从而抛出错误。
解决办法
调整参数顺序,将数据库连接cnxn作为第二个参数传入,同时把查询参数放到params参数中(需以列表/元组形式传入):
方法一(指定参数名):
import pandas as pd data_BG2 = pd.read_sql( sql="SELECT * FROM [dbo].[Bullgear geometry] WHERE [Bullgear]=?", con=cnxn, params=["3810907-01110"] )
方法二(按位置传参):
import pandas as pd data_BG2 = pd.read_sql( "SELECT * FROM [dbo].[Bullgear geometry] WHERE [Bullgear]=?", cnxn, params=["3810907-01110"] )
内容的提问来源于stack exchange,提问作者Dhruv Kumar
相关产品推荐
相关产品推荐

