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

psycopg2执行INSERT时报错变量被识别为不存在的列如何解决

错误原因&解决方法
  • 核心错误:SQL参数传递逻辑错误
    你直接把Python变量名写进了SQL字符串中,PostgreSQL服务端接收SQL语句时完全无法识别这些Python侧的变量,只会将其当作表的字段名检索,自然就会抛出「列不存在」的报错。psycopg2要求使用参数化查询完成值传递:用%s作为值的占位符,将需要传入的值放在元组中,作为cur.execute()的第二个参数传入即可。
  • 隐藏问题1:函数参数不匹配
    你定义insert_data()时要求传入word参数,主函数调用时没有传参,修复第一个问题后也会抛出参数缺失错误。
  • 隐藏问题2:连接关闭时机错误
    你在insert_data()中插入单条数据就关闭了数据库连接,后续如果要执行其他数据库操作都会直接失败,关闭连接的逻辑应当放在所有数据库操作全部完成之后。
  • 隐藏问题3:建表未提交
    psycopg2默认关闭自动提交,建表语句执行后如果不手动提交,表不会实际创建,后续插入操作会抛出「表不存在」的错误。
修正后代码示例
import psycopg2
# 你的日志初始化、handle_dict()函数定义等前置代码保持不变

con = psycopg2.connect(
    database="dbname",
    user="username",
    password="password",
    host="127.0.0.1",
    port="5432"
)
cur = con.cursor()


def create_words_table():
    cur.execute(""" CREATE TABLE WORDS 
        (word_ CHAR(50),
        POS_ CHAR(20),
        case_ CHAR(20),
        animacy_ CHAR(20),
        tense_ CHAR(20),
        person_ CHAR(20),
        number_ CHAR(20),
        gender_ CHAR(20),
        mood_ CHAR(20),
        tonality_ CHAR(20),
        POS_score_ REAL NOT NULL,
        NEU_score_ REAL NOT NULL,
        NEG_score_ REAL NOT NULL );""")
    con.commit() # 新增建表提交逻辑


def insert_data(word):
    # handle_dict() 是用于获取外部数据的函数
    if handle_dict(word) is not None:
        (word_from_dict, pos_from_dict, case_from_dict, gender_from_dict,
         mood_from_dict, number_from_dict, person_from_dict, tense_from_dict,
         tonality_from_dict, pos_score_from_dict, neu_score_from_dict,
         neg_score_from_dict) = handle_dict(word)
        # 改写成参数化查询格式
        cur.execute('''INSERT INTO WORDS (word_, POS_, case_, gender_, mood_, 
        number_, person_, tense_, tonality_, POS_score_, NEU_score_, NEG_score_)       
        VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)''',
        (word_from_dict, pos_from_dict, case_from_dict, gender_from_dict, 
        mood_from_dict, number_from_dict, person_from_dict, tense_from_dict, 
        tonality_from_dict, pos_score_from_dict, neu_score_from_dict, 
        neg_score_from_dict))
        con.commit()


if __name__ == '__main__':
    create_words_table()
    logger.info("table created")
    # 传入实际需要处理的word参数即可
    insert_data("你要处理的目标词汇")
    logger.info("Records inserted successfully")
    # 所有操作完成后统一关闭游标和连接
    cur.close()
    con.close()

参数化查询的写法除了能解决本次报错之外,还可以避免SQL注入风险,不要使用字符串拼接的方式直接拼接SQL值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 11:27:05