PostgreSQL 插入数据报错:column “xxx“ does not exist 解决方法
背景
shell 脚本跑 Python 写数据脚本任务的时候报错:
File "./xxx.py", line 59, in xxxcur.execute(insert_sql(col_string, str(data_list)))
psycopg2.ProgrammingError: column "it’s adj for sb和it's adj of sb的区别" does not exist
LINE 1: ...1', 'student', 16, '八年级下册', 20211028, 50347, "it’s adj ...
原因
做 print 输出之后发现是这个数写入报错:
it’s adj for sb和it's adj of sb的区别
可以看出其实是 ’
和 '
混用了(作为写作遵循互联网写作规范的强迫症患者我对于这种混用真的不能忍)。
然后在 stackoverflow 上查到了这个相关问题:Insert text with single quotes in PostgreSQL。但是它的解决方案在我看来还是不太符合我的要求,毕竟写入 pg 的数据不能因为 '
报错就强制将单个 '
转为 ''
。所以我就将 '
替换为 ’
,发现执行还是报错,意识到关键问题不在这里。
然后在 这篇博客 找到了原因,据 wiki.postgresql 官网 解释:
PostgreSQL uses only single quotes for this (i.e. WHERE name = 'John'). Double quotes are used to quote system identifiers; field names, table names, etc. (i.e. WHERE "last name" = 'Smith').
MySQL uses ` (accent mark or backtick) to quote system identifiers, which is decidedly non-standard.
翻译过来就是:
PostgreSQL 只能用单引号(’)表示值,双引号(")是表示系统标识符的,比如表名或者字段名。MySQL 使用 `(重音标记或反引号)来引用系统标识符,这绝对是非标准的。
因为其实上面写入的数据完整格式是:
insert into xxx (字段1, 字段2, 字段3) values ('student', "it’s adj for sb和it's adj of sb的区别", '概念课')
发现只有字段2外面是 "
,而 pg 的双引号 "
是表示系统标识符,根本写不进 pg。其实我猜测应该就是因为字符串内部有 '
,导致的外部引号变为了 "
。
于是我就在 Python 代码里进行了字符替换:
str.replace("\"", "\'").replace("\'s ", "’s ")
先将外部 "
替换为 '
,然后再将 '
替换为 ’
。但要注意实际情况中 's
有可能会匹配到 'student'
,因此我多匹配了一位空格,将 's空
替换为 ’s空
。
感想
发现这个报错很明显是历史遗留问题,但是基本不会考虑到。因为写入 pg 数据库的数据应该是用户在前端输入的,符号混用这种情况真的没办法去控制。然而单引号、双引号、反引号这种在 PostgreSQL 里又和 MySQL 不太一样,很容易引起问题。
PostgreSQL 插入数据报错:column “xxx“ does not exist 解决方法相关推荐
- readxl包导入excel报错Error: `path` does not exist解决方法
readxl包导入excel报错Error: `path` does not exist解决方法 方法1:File - import dataset - from excel 方法2:检查语法错误 正 ...
- Data too long for column ‘xxx‘ at row 1解决方法
在flask添加字段的时候,提示 Data too long for column 'xxx' at row 1 此时,只需在模板也导入长字段 from sqlalchemy.dialects.mys ...
- 脱坑:Kettle+postgres:Caused by: org.postgresql.util.PSQLException: ERROR: column “xxx“ does not exist
用kettle往postgres数据库中传数据时,发现了这样的问题: 可是实际上是有这个字段的,数据库中字段为大写的"SUPPLIER_CODE". 第一次操作pg数据库,没有经验 ...
- 往MySQL插入数据报错Incorrect date value: '1982' for column
往MySQL插入数据报错Incorrect date value: '1982' for column 总结:在mysql中插入date类型的数据时,需要加上引号''
- JDBC使用占位符插入数据报错
JDBC使用占位符插入数据报错 插入数据时 String sql="insert into user(id,name) values (1,?)" PreparedStatemen ...
- SpringBoot向Mysql中插入数据报错:org.springframework.dao.InvalidDataAccessResourceUsageException: error perfo
SpringBoot向Mysql中插入数据报错:org.springframework.dao.InvalidDataAccessResourceUsageException: error perfo ...
- Cause: org.postgresql.util.PSQLException: ERROR: column province_id does not exist
数据库中的表bs_province如图所示: SQL语句: select PROVINCE_ID, PROVINCE_CODE, PROVINCE_NAME, SHORT_NAME, LNG, LAT ...
- mysql 1033_mysql报错1033 Incorrect information in file: ''''xxx.frm''''问题的解决方法(图)...
这篇文章主要介绍了关于mysql报错1033 Incorrect information in file: 'xxx.frm'问题的解决方法,文中通过示例代码介绍的很详细,需要的朋友可以参考借鉴,下面 ...
- svn update 时报错 Node remains in conflict 和解决方法
文章目录 svn update 时报错 Node remains in conflict 和解决方法 svn update 时报错 Node remains in conflict 和解决方法 今天在 ...
最新文章
- 局部响应归一化LRN(Local Response Normalization)
- Linux操作系统下利用SSH进行远程控制
- Oracle 数据库的替代变量问题(即 set define off/on 的用法)
- 2017年计算机三级网络技术试题,2017年计算机三级网络技术考前试题及答案(8)
- android 7.0编译报错,编译android7.0 sdk错误解决方法
- 最强NLP模型BERT可视化学习
- ege限制鼠标移动的函数_浅谈函数节流和函数防抖
- git 怎么备份本地分支_同步管理本地git仓库和github仓库上的分支
- Spring-AbstractRefreshableApplicationContext
- JavaSE: SuppressWarnings[转]
- html的基本标记符,html的基本标记符号
- WindowsMobile配置英文ROM显示中文问题(解决程序中文乱码)
- EXP-00091 Exporting questionable statistics问题解决
- 在VMware16中安装 Win10操作系统
- 【web框架】【zheng学习笔记(二)】【外网正式环境下部署(CentOS7.4)】
- firefox autoproxy 实现ssh代理上网,针对XP,新版可以用firefox的foxproxy组件
- 小学六年级数学教案:圆柱与圆锥
- 百度UEditor编译器中获取HTML内容和纯文本,设置UEditor编辑器的内容
- 计算机从一级到四级要学多久,从一级到四级 全国计算机等级考试全攻略
- freertos---队列管理