为何调用时出现SQL.__init__()仅接受2个位置参数却传入3个的错误?
错误原因及解决办法
错误根源
你遇到的SQL.__init__() takes 2 positional arguments but 3 were given错误,是因为你错误地给sql.SQL()传递了两个参数:SQL语句字符串和值元组,但sql.SQL()构造函数只接受一个参数(SQL模板字符串),多余的参数导致参数数量不匹配。
正确写法
sql.SQL()只负责构建SQL模板,参数值应该单独传给cur.execute(),同时要替换掉不安全的%s,改用sql.Placeholder()来避免SQL注入风险:
# 构建带安全占位符的SQL模板 sql_template = sql.SQL('INSERT INTO {table} (time_stamp,surf_1,height_1,period_1,dir_1,surf_2,height_2,period_2, \ dir_2,sea_height,sea_period,sea_direction,chop_height,chop_direction) \ VALUES ({},{},{},{},{},{},{},{},{},{},{},{},{},{})').format( table=sql.Identifier(str(plot_buoy)), # 生成对应数量的安全占位符 *[sql.Placeholder() for _ in range(14)] ) # 执行SQL时单独传递参数值 cur.execute(sql_template, (df.index[0],df.iloc[0][0],df.iloc[0][1],df.iloc[0][2],df.iloc[0][3],df.iloc[0][4],df.iloc[0][5],df.iloc[0][6], df.iloc[0][7],df.iloc[0][8],df.iloc[0][9],df.iloc[0][10],df.iloc[0][11],df.iloc[0][12]) )
关键注意点
sql.SQL()仅接收SQL模板字符串,不能直接传参数值- 禁止用
%s作为占位符,必须用sql.Placeholder()配合format()生成安全占位符 - 参数值必须作为
execute()的第二个参数传入,这是数据库驱动处理参数绑定的标准方式
内容的提问来源于stack exchange,提问作者blaughli
相关产品推荐
相关产品推荐

