KingbaseES V9 数据库试用记录——使用 Node.JS knex 框架调用并记录与 PostgreSQL 不同之处

尝试使用国产数据库 KingbaseES ,在必要的情况下替换 PostgreSQL,本文将持续记录在尝试过程中遇到的问题和解决方案,目前使用的编程语言是 Node.JS,数据库操作使用 knex。

KingbaseES V9 数据库试用记录——使用 Node.JS knex 框架调用并记录与 PostgreSQL 不同之处

版本号检测导致无法操作数据库

使用 knex 以 PostgreSQL 模式连接数据库时,如果没有指定版本号,knex 会报错导致 Node.JS 程序终止。

原因分析

使用 knex 连接数据库时,如果没有指定版本号,knex 会主动进行检测,但由于 KES 中 select version() 返回的格式与 PostgreSQL 不同,导致 knex 报错。

knex 用 PostgreSQL 模式连接时会预期查询结果中带有 PostgreSQL 字符串

knex 希望返回结果中包含 PostgreSQL 字符串

PostgreSQL 数据库中的查询结果

但是 KES 中实际返回结果不包含该字符串

KingbaseES V9 数据库中的查询结果

解决方式

在 knex 的连接配置中通过 version 参数指定版本,可以避免上述的检测过程,从而实现正常使用。

在配置项中明确指定 version

设置为 not null 的字段无法插入空字符串

尝试往设置为 not null 的 description 字段插入空字符串时,数据库提示违反非空约束,且返回的详情中把 description 位置的空字符串显示成了 null

原因分析

KES 内部将空字符串认作了 null

往 description 字段插入空字符串,提示违反 not-null 约束

经查询资料确定,通过容器方式运行 KES 时,默认启用 Oracle 兼容模式,并开启 ora_input_emptystr_isnull 参数,此时在插入或查询时空字符和 null 都会被当作 null。

解决方式1

修改兼容模式,可以用 set ora_iput_emptystr_isnull = no 单独修改本参数,也可以直接将整个数据库调整为 PG 兼容模式,为了避免以后遇到更多的兼容问题,我直接将整个容器销毁,并以 PG 兼容模式重新创建。

以 PG 兼容模式重新创建容器

这里需要主要,通过 DB_MODE=pg 以 PG 兼容模式启动数据库时,必须同时添加参数 ENABLE_CI=no ,否则数据库无法正常启动

解决方式2

如果数据库环境无法控制,建议修改数据库中的表定义,让字符串字段允许 null,同时程序中做好检查避免使用空字符串,没有数据时一律使用 null,从程序本身的层面来确保对两种不同行为方式数据库的兼容性。

如过程序本身没有非要区分 null 和空字符串的需求,建议即使已经采用了方案1,也同时采用方式2的原则,提高程序的兼容性。

参考资料

  1. KingbaseES常见问题手册 
  2. KingbaseES数据库docker部署手册

更多

12KB的Excel导出库sheetex是怎么来的

这是一个关于前端 Excel 导出库 sheetex 的故事:我为什么要做这个库,它为什么会这么小,以及你是否值得一试。 如过你问我“为什么非要在前端导出”,那将是另一个故事。 我的数据导出史 不知道你是否还记得自己是从什么时候开始接触数据导出的? 我对自己的“数据导出史”还算有些印象:在还没有正式工作的时候,如果有人问我要数据,我会在数据库管理工具里写个查询语句,然后视对方的用途,导出成SQL 语句、CSV 文件或者Excel 等;待到工作了,需要开发面向最终用户的系统,就不能再这么手工处理,导出功能成为系统标配,用户点击一个按钮,就要下载到相应的文件。 最早是 CSV 格式,因为其生成相对容易,而且也可以通过 Excel 软件进行查看,加上主要是内部用户,偶有无法打开也只要简单培训就能解决。 但随着用户类型变得广泛起来,这种“偶尔”也逐渐变成无法忍受,那么干脆直接导出 Excel 文件吧,反正开源库也已经成熟,于是使用 SheetJS

By 熊立丁
用 Aria2 & AriaNg 搭建离线下载平台

用 Aria2 & AriaNg 搭建离线下载平台

环境 硬件:Mac Mini 2014 4C4G 操作系统:Debian 12 IP地址:192.168.2.2 流程 1. 切换到管理员权限 su root 2. 安装 aria2 apt install aria2 3. 以服务的形式运行 aria2 aria2c --enable-rpc --rpc-listen-all=true --rpc-allow-origin-all --enable-rpc 启动 rpc 服务 --rpc-listen-all=true 允许从任意 IP 访问 --rpc-allow-origin-all 允许浏览器跨域访问 4. 配置 nginx 增加站点用于放置前端界面

By 熊立丁
浙ICP备15043004号-1