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

在Python中调用SQL函数时cursor.execute报语法错误求助

问题解决:cursor.execute语法错误及参数传递问题

错误原因分析

你遇到的SyntaxError核心原因有三个:

  • cursor.execute()的参数必须是字符串形式的SQL语句,直接写select ...会被Python当成代码而非字符串,触发语法错误。
  • 直接在SQL中写"list"会被PostgreSQL识别为数据库标识符,而非Python变量,必须通过参数绑定传递变量值。
  • 代码存在缩进错误:except块的打印语句、if块内的列名/数据读取代码未正确缩进,这也会导致运行异常。

修正后的完整代码

import psycopg2
import pandas as pd

try: 
    ps_connection = psycopg2.connect(
        user="x",
        password="y",
        host="z",
        port="w",
        database="w"
    )

    cursor = ps_connection.cursor()

    # 替换成你从Excel读取后得到的实际列表变量
    input_list = ["示例值1", "示例值2"]

    # SQL语句用三重引号包裹,支持多行格式;用%s作为参数占位符
    sql_query = """
        select "Issuer Status" 
        from api.match_sec_str_array(%s)
    """
    # 参数必须以元组形式传递,即使只有一个参数
    cursor.execute(sql_query, (input_list,))

    columns = []
    data = []
    if cursor.description:
        # 读取查询结果的列名
        columns = [desc[0] for desc in cursor.description]
        # 读取所有数据行
        data = cursor.fetchall() 

except psycopg2.OperationalError as connection_error:
    print('Unable to connect to the database')
    print(connection_error)
finally:
    # 确保游标和连接无论是否出错都能被关闭,避免资源泄漏
    if 'cursor' in locals() and cursor:
        cursor.close()
    if 'ps_connection' in locals() and ps_connection:
        ps_connection.close()

# 生成DataFrame并输出
df = pd.DataFrame(data, columns=columns)
print(df)

关键注意事项

  • SQL语句必须是字符串:用单引号、双引号或三重引号包裹均可,三重引号适合多行SQL,可读性更强。
  • 参数绑定规范:psycopg2使用%s作为占位符(仅语法与Python格式化符相似,并非同一机制),传递参数时需放在元组中。对于Python列表,psycopg2会自动转换为PostgreSQL的数组类型,无需额外调用json.dumps()(除非你的SQL函数明确要求JSON格式字符串)。
  • 缩进严格遵循规范:Python是缩进敏感语言,except、if等代码块内的内容必须保持统一缩进(通常为4个空格)。
  • 资源安全释放:用finally块确保数据库连接和游标始终被关闭,避免长期占用数据库资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:10:59