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
相关产品推荐
相关产品推荐

