要求: 框架源码不能变, 有什么配置可以让项目不查询系统表么?
在适配过程中经常会遇到程序查询目标表报错字段不存在的错误,实际上是因为当前实际查询的表并不是自己的目标表。
报错示例:ERROR:column r.id does not exist
情况一(列名确实不存在)
-- 先确认表结构和列名在目标模式下是否存在
\d+ 模式名.表名 -- 在ksql中查看表结构或
SELECT column_name FROM information_schema.columns
WHERE table_name = '表名' AND table_schema = '模式名';
如果查出来实际模式下并没有目标表,需要先将表导入,再调用程序查询;
如果查出来实际模式下确实存在该目标表,请参考情况二、三
情况二(与系统表重名)
程序查询目标表(例如:sys_user、sys_config等)与金仓数据库系统表重名,程序默认会先查询系统表,所以会报错字段不存在的错误(ERROR:column r.id does not exist)。此时,我们需要将目标表所在的模式优先级提高,提升到public与系统模式之上。
1、首先确认目标表所在的模式以及数据库(例如表是在test库的cms模式下)
2、使用system用户命令行登录test数据库或者使用KStudio连接test库执行以下sql
alter database 数据库名 SET search_path to “$user”,模式名,public,sys_catalog,sys,pg_catalog;然后执行 select sys_reload_conf(); -----重置配置文件注:数据库名改成test,模式名改成cms,执行时以自己实际库和模式为准。
3、执行之后,不论是命令行还是客户端工具都需要断开重连一下,还是使用system用户登录test库执行show search_path; 确认cms模式是否已经提升优先级。
4、此时程序断开重连测试,字段不存在问题已解决。
**注:如果是与系统表重名,不可以使用连接串加?currentSchema='模式名'的方式来指定模式。**
情况三(与其他模式表重名)
在不配置模式优先级的情况下,public模式的优先级比其他普通模式要高。会优先查询public再查询其他模式对象。
如果同一个表,在public模式下和目标模式下都存在,但是结构不一样。这个时候也会报错列名不存在的错误。此时我们需要提高目标模式的优先级
方法一 (同上一步):
alter database 数据库名 SET search_path to “$user”,模式名,public,sys_catalog,sys,pg_catalog;然后执行 select sys_reload_conf(); -----重置配置文件注:数据库名改成test,模式名改成cms,执行时以自己实际库和模式为准。
方法二(url指定模式):
jdbc:kingbase8://ip地址:端口/库?currentSchema='模式名'
注:方法一和方法二值可选一种使用,不可同时配置