使用psycopg2执行INSERT...SELECT遇错误及数据未更新问题求助
解决psycopg2插入SELECT结果到表的问题
可运行Python脚本
假设目标表名为target_table,且字段顺序和SELECT查询的输出完全匹配(若不匹配需显式指定目标表字段):
import psycopg2 from psycopg2 import OperationalError def insert_select_result(): conn = None try: # 替换为你的数据库连接参数 conn = psycopg2.connect( dbname="your_db_name", user="your_user", password="your_password", host="your_host", port="your_port" ) cur = conn.cursor() # 完整的INSERT INTO ... SELECT语句 insert_query = """ INSERT INTO target_table select t._createdat_date, t._createdat_date_year_month, t._createdat_date_month, t._createdat_date_month_name, t."type", empresas, sum(pe) sum_1, sum(p2) sum_1, sum(char) sum_1, sum(cash1) sum_1, sum(cash2) sum_1, count(finan) count_1 from table1 t group by 1,2,3,4,5,6 """ cur.execute(insert_query) # 必须提交事务,否则数据不会写入数据库 conn.commit() print(f"成功插入 {cur.rowcount} 条记录") except OperationalError as e: print(f"数据库连接错误: {e}") if conn: conn.rollback() except Exception as e: print(f"执行错误: {e}") if conn: conn.rollback() finally: if cur: cur.close() if conn: conn.close() if __name__ == "__main__": insert_select_result()
问题原因说明
TypeError错误原因:
用%s占位符搭配INSERT+SELECT是错误用法。psycopg2的%s仅用于传递Python外部变量,而INSERT INTO ... SELECT是直接用SQL查询结果插入,不需要任何占位符,执行完整SQL语句即可。数据无变化原因:
psycopg2默认开启事务模式,执行execute()后必须调用conn.commit()提交事务,否则所有操作会在会话结束后回滚,数据库不会保留修改。
注意事项
- 确保
target_table的字段数量、数据类型与SELECT输出完全匹配;若字段顺序不一致,需显式指定目标表字段,例如:INSERT INTO target_table (col1, col2, col3, ...) SELECT ... - 若目标表存在唯一约束,可添加
ON CONFLICT DO NOTHING或ON CONFLICT DO UPDATE子句处理冲突。
内容的提问来源于stack exchange,提问作者José Erildo
相关产品推荐
相关产品推荐

