Caused by: org.postgresql.util.PSQLException: ERROR: column xxx.xxx does not exist

最近在做压力测试,需要将生产上的两个数据库数据导到测试环境上来,因为涉及到数据库的操作都是交给DBA来做的,所以就没有管,然后当DBA跟我说一切OK之后,为了保险起见我还是决定在本地试一下,项目是正常起来了,当我打一个get请求之后。。。,出现了尴尬的一幕,报错啦:relation "xxx" does not exist

Caused by: org.postgresql.util.PSQLException: ERROR: column xxx.xxx does not exist_第1张图片

说我的表不存在,纳尼?数据库连接、entity一切都没有变的呀,联想起以前也出现过类似的情况,是数据库的search_path没有修改,于是向亲爱的DBA同事反映了,效率很快的改好了,再试了下,发现这个数据库确实是好了,再试试另一个数据库,发现又报错了,但是这次的和之前的报错不一样了,上次是表找不到,这次是列找不到,报错信息如下:

exception occurs: org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet;

Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet

Caused by: org.postgresql.util.PSQLException: ERROR: column shiplocati0_.latitude does not exist

Caused by: org.postgresql.util.PSQLException: ERROR: column xxx.xxx does not exist_第2张图片

 

虽然很尴尬,但是不能慌,网上看看可有兄弟跟我遇到一样的问题,看了一圈,发现大家出现这样的问题大致是两种原因:

1.表与字段没有对应起来

2.数据库连接池配置方言与数据库不匹配

 

但是仔细检查了一遍,我的字段没有动,表数据也是DBA直接copy过来的,第一种情况应该不会发生,方言我也没有动,检查了下也是没问题的,这让我很难受。

思来想去没道理啊,难道是因为DBA只改了第一个库的search_path?但是,这么明明就找到了表的呀,只是字段没有,强迫自己静下来,倒杯水戴上耳机听听歌。。。继续去网上看看,看到一个哥们是这样解决的:

Caused by: org.postgresql.util.PSQLException: ERROR: column xxx.xxx does not exist_第3张图片

原文:https://stackoverflow.com/questions/58477715/org-postgresql-util-psqlexception-error-column-systementi0-id-does-not-exist

虽然我感觉不是schema的问题,因为我觉得我们的DBA肯定两个表的search_path都改了。但是我已经走投无路了,死马当活马医吧,在@Table注解上加上 schema 属性 ,

@Table(name = "table_name", schema = "schema_name")

试了下,发现居然解决问题了,我???

唉,人与人之间的信任呢?但是我在想,既然schema不对,它是怎么找到表的呢?

因为我们用的schema都是自定义的schema,而不是默认的public,所以我们正在使用的数据库都是修改了search_path为自定义的schema的,但是,后面这个库没有改search_path,它会使用默认的public的schema,它怎么会找得到表呢?于是去数据库看了一下,发现默认的public schema里面居然真的有这张表,但是比现在的表要少几个字段。。。应该是以前项目早期建的表,问了下老同事,发现确实是这样,太坑了啊。。。被自己蠢哭了,应该早早问问DBA有没有改第二个库的search_path的。。。

既然问题找到了,让DBA改下search_path就OK啦。所以说,我的问题其实还是上面说的第一种情况,但是不是那么的明显就能看出来的。

你可能感兴趣的:(jpa,jpa,hibernate,postgresql,schema,spring)