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

为何调用时出现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:27:36