psycopg3 INSERT语句变量传参正确写法及插入不生效问题解决
Psycopg3 插入数据无报错但不生效问题修复方案
核心原因
- Psycopg3默认开启事务机制,对数据库的修改操作需要显式提交才会持久化写入,原插入代码没有提交事务,连接块退出时事务自动回滚,导致数据没有写入。
- 插入代码连接的数据库名为
ideatest,查询代码连接的数据库名为ideaTest,PostgreSQL对数据库名大小写敏感,两边不一致会导致查询的不是同一个库,自然查不到写入的数据。 - 参数占位符
%s的写法本身符合Psycopg3的语法规范,不需要修改。
正确插入代码示例
写法1:手动提交事务(推荐,适合需要事务控制的场景)
with psycopg.connect('dbname=ideatest user=postgres password=password') as conn: with conn.cursor() as cur: cur.execute(''' INSERT INTO ideastorage (given_idea_id, idea_designation, idea_summary, idea_creation_time) VALUES (%s, %s, %s, %s)''', (ideaID, ideaName, ideaSummary, ideaTime) ) # 事务提交必须写在cursor上下文块之外、connection上下文块之内 conn.commit()
写法2:开启自动提交(适合单条不需要事务回滚的简单操作)
# 连接时指定autocommit=True,修改会自动生效无需手动提交 with psycopg.connect('dbname=ideatest user=postgres password=password', autocommit=True) as conn: with conn.cursor() as cur: cur.execute(''' INSERT INTO ideastorage (given_idea_id, idea_designation, idea_summary, idea_creation_time) VALUES (%s, %s, %s, %s)''', (ideaID, ideaName, ideaSummary, ideaTime) )
查询代码修复
统一数据库名称为小写的ideatest即可:
with psycopg.connect('dbname=ideatest user=postgres password=password') as conn: with conn.cursor() as cur: cur.execute(''' SELECT idea_designation, idea_summary, idea_creation_time FROM ideastorage ORDER BY idea_designation''' ) # 可将查询结果赋值给变量后续处理 query_result = cur.fetchall()
内容的提问来源于stack exchange,提问作者Caritas
相关产品推荐
相关产品推荐

