使用psycopg2插入DataFrame数据时报ProgrammingError relation不存在错误
问题排查与解决方案
报错ProgrammingError: relation "skill" does not exist的核心是PostgreSQL无法定位到你指定的表,结合你已经验证的前提,可按以下优先级排查修复:
- 搜索路径未包含public schema
PostgreSQL会按连接用户的search_path配置顺序查找表,若该配置未包含public,直接写表名会找不到。
最优解决方法是直接使用全限定表名,修改插入语句即可:
也可以在执行插入操作前先设置搜索路径:cursor.execute("INSERT INTO public.skill VALUES (%s, %s)", row)cursor.execute("SET search_path TO public;") - 表名大小写敏感
如果你创建表时给表名加了双引号(例如CREATE TABLE "Skill" (...)),PostgreSQL会保留表名的大小写,你代码里写小写skill就会匹配失败。
解决方法:核对创建表时的表名大小写,SQL中写完全一致的表名并加双引号,或者重新建表使用无引号的小写表名(PostgreSQL默认会将无引号的标识符转为小写,不会产生大小写匹配问题) - 额外优化建议
你当前使用iterrows逐行插入的方式效率极低,当DataFrame数据量较大时性能会很差,推荐使用psycopg2.extras.execute_values做批量插入,或者直接用pandas的to_sql方法写入,性能提升非常明显。
内容的提问来源于stack exchange,提问作者Jordan Lowry
相关产品推荐
相关产品推荐

