Python 3脚本无法写入Postgres 9.5表,请求排查解决
解决AD用户数据写入PostgreSQL无报错但未入库的问题
看起来你碰到了psycopg2操作PostgreSQL时的常见坑——代码没报错,但数据就是没写到库里。我帮你梳理几个最可能的原因和对应的解决步骤:
1. 事务未提交(90%的概率是这个原因)
psycopg2默认会自动开启事务,如果你只执行了插入语句但没有提交,所有操作都会在连接关闭时自动回滚,数据自然不会持久化到数据库里。哪怕没有任何报错提示,这个问题也很容易被忽略。
修复后的完整代码示例:
import psycopg2 from psycopg2 import sql # 你的AD用户数据(已转为字符串类型) draft = [('Display Name', 'username'),] try: # 建立数据库连接 new_conn = psycopg2.connect("dbname='test' user='usr' host='localhost' password='pswd'") cur = new_conn.cursor() # 编写插入语句,用ON CONFLICT避免重复(假设username是唯一标识) insert_query = sql.SQL(""" INSERT INTO main_associate (display_name, username) VALUES (%s, %s) ON CONFLICT (username) DO NOTHING; """) # 批量插入数据(比单条插入高效) cur.executemany(insert_query, draft) # 重点!必须提交事务才能让数据落地 new_conn.commit() # 打印插入数量,验证是否有数据被写入 print(f"成功插入 {cur.rowcount} 条新记录") except psycopg2.Error as e: print(f"数据库操作出错: {e}") # 出错时回滚事务,避免脏数据 if new_conn: new_conn.rollback() finally: # 收尾:关闭游标和连接 if cur: cur.close() if new_conn: new_conn.close()
2. 重复判断逻辑失效
如果你的ON CONFLICT子句指定的字段没有唯一约束,或者你选错了判断重复的字段,数据库根本识别不了哪些是重复数据,或者你的数据其实已经存在但你没察觉。
排查步骤:
- 直接在PostgreSQL里查询,确认目标数据是否已经存在:
SELECT * FROM main_associate WHERE username = 'username'; - 检查表是否有对应的唯一约束:在psql里执行
\d main_associate,查看username字段是否带有UNIQUE标记。如果没有,需要手动添加约束:ALTER TABLE main_associate ADD CONSTRAINT unique_username UNIQUE (username);
3. SQL语句或字段匹配错误
如果你的SQL语句里写错了表名、字段名(比如把display_name写成displayname),或者字段顺序和传入的数据不匹配,执行时不会报错,但cur.rowcount会返回0,说明没有任何记录被插入。
验证方法:
在执行executemany之后打印cur.rowcount的值,如果是0,要么是数据全重复了,要么就是SQL语句有问题,需要核对表结构和字段名。
4. 数据类型不兼容
虽然psycopg2会自动处理大部分Python和PostgreSQL的类型转换,但如果你的字段类型和传入的字符串不兼容(比如字段是固定长度的CHAR(10)但你的用户名长度超过10),可能会出现数据被静默截断或者无法插入的情况。这种情况建议检查main_associate表的字段类型是否和你的AD数据匹配。
内容的提问来源于stack exchange,提问作者Tuffgong
相关产品推荐
相关产品推荐

