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

Python 2.7+PostgreSQL 10.0插入用户输入数据报错求助

解决Python 2.7 + PostgreSQL 10插入数据的占位符问题

你这是在SQL插入操作里踩了几个典型的新手坑,我来帮你逐个拆解清楚:

为什么你的几种写法都报错?

  • .format()拼接SQL的问题:直接把变量硬拼进SQL语句里,会导致字符串类型的值缺失引号(比如person_first是"Bob"的话,拼出来的SQL会是VALUES(Bob, ...),数据库会把Bob当成表/列名而非字符串值),这就是你看到"输入值为非字符串"错误的根源。而且这种写法还会带来致命的SQL注入风险,绝对不能用。
  • %s占位符报错的问题:你大概率是把%s和变量直接拼到了SQL字符串里(比如"INSERT ... VALUES(%s,%s)" % (name, age)),但psycopg2(Python连接PostgreSQL的标准库)要求参数必须单独作为第二个参数传给execute(),让驱动自行处理类型转换和转义,直接拼接必然会触发语法错误。
  • ?占位符失败的问题:PostgreSQL的Python驱动psycopg2不支持?作为占位符,它的标准占位符就是%s,用?会被数据库判定为无效SQL语法。

正确的写法

你需要使用psycopg2的参数绑定机制,将SQL语句和参数分离传递:

# 先处理用户输入(假设你已经完成raw_input的获取)
person_first = raw_input("请输入名: ")
person_last = raw_input("请输入姓: ")
person_email = raw_input("请输入邮箱: ")
person_age = int(raw_input("请输入年龄: "))  # 显式转换为int类型

with conn:
    cursor = conn.cursor()
    # 用%s做占位符,无需手动加引号,psycopg2会自动处理类型
    sql = "INSERT INTO people(person_first, person_last, person_email, person_age) VALUES (%s, %s, %s, %s)"
    # 将参数打包成元组,作为execute的第二个参数传入
    cursor.execute(sql, (person_first, person_last, person_email, person_age))
    # with语句会自动处理事务提交,无需手动调用conn.commit()

额外提醒

  • 确保你使用的是psycopg2库(PostgreSQL官方推荐的Python驱动),其他驱动语法可能略有差异,但psycopg2是最通用的选择。
  • person_age必须是int类型,显式转换能避免用户输入非数字时的类型错误,psycopg2也能自动适配数据库的int字段。
  • 永远不要手动给字符串加引号或转义特殊字符,psycopg2会自动完成这些操作,从根源避免SQL注入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:54:04