使用dotenv连接PostgreSQL,以列表作为cursor.execute参数批量删指定ID行
批量删除PostgreSQL中指定ID的数据行
原代码存在的问题
- SQL语句用
=匹配ID列表,PostgreSQL里匹配多个值得用IN操作符,=只能对应单个值 - 没提交事务:PostgreSQL默认不会自动提交增删改操作,不提交的话,连接关闭后操作会回滚,等于白删
- 多余的
cursor.close():with conn.cursor()上下文管理器会自动关闭游标,不用手动调用
修正后的代码
ids_to_delete = df["food_id"].tolist() # 用上下文管理器管理连接,自动处理关闭逻辑 with create_conn() as conn: with conn.cursor() as cursor: # 使用IN操作符批量匹配ID sql = """ DELETE FROM food_recommandations.food_categorisation WHERE food_categorisation.food_id IN %(ids)s """ # 将列表转为元组传入,psycopg2会自动适配PostgreSQL的语法 cursor.execute(sql, {"ids": tuple(ids_to_delete)}) # 提交事务,确保删除操作生效 conn.commit()
关键说明
- 必须调用
conn.commit():PostgreSQL的事务机制要求,所有增删改操作都得提交才能持久化到数据库 - 列表转元组:psycopg2对元组支持更友好,会自动把它转成
(id1, id2, id3)的格式,适配IN语句的需求 - 连接管理:用
with语句管数据库连接,能避免忘关连接导致的资源泄漏问题
内容的提问来源于stack exchange,提问作者Louis Martin du Nord
相关产品推荐
相关产品推荐

