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

CRUD操作中SELECT查询出现psycopg2语法错误(%s相关)求助

解决Flask+PostgreSQL查询时的语法错误问题

嘿,我来帮你搞定这个报错!你遇到的问题主要有两个关键点,咱们一步步修正:

1. PostgreSQL逻辑运算符用错了

你SQL里的&&是PostgreSQL的数组重叠运算符,不是用来做逻辑“与”的!正确的逻辑与应该用AND,这是导致语法错误的核心原因之一。

2. psycopg2执行查询时没传参数

psycopg2确实用%s作为参数占位符,但你必须把要替换的参数作为第二个参数传给cur.execute()方法,不然数据库根本不知道该把什么值填进去,这是第二个问题。

另外还要注意:你的路由默认只支持GET请求,处理POST的话得显式声明methods=['GET', 'POST'],而且要初始化productlist变量,避免GET请求时页面渲染报错。

修正后的完整代码

@app.route('/Index', methods=['GET', 'POST'])
def querypage():
    cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
    error = ''
    productlist = []  # 初始化列表,避免GET请求时变量未定义
    if request.method == 'POST':
        PRODUCT = request.form['PRODUCT']
        PRICE = request.form['PRICE']
        # 替换&&为AND,修正逻辑运算符
        sql = "SELECT * FROM TBSHOPING WHERE PRODUCT = %s AND PRICE = %s"
        # 将参数以元组形式传递给execute,psycopg2会自动处理转义
        cur.execute(sql, (PRODUCT, PRICE))
        productlist = cur.fetchall()
    # 把render_template移到外层,GET/POST请求都能正常渲染页面
    return render_template('datatable.html', productlist=productlist)

额外提醒

  • 用这种参数传递方式还能避免SQL注入风险,比直接拼接字符串安全得多。
  • 如果你的PRICE是数值类型,psycopg2会自动帮你处理类型转换,不用额外转成字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 20:22:31