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

