VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

连接Vastbase时需注意的问题

连接

使用SQLAlchemy连接Vastbase时使用Postgresql的数据库模式。连接串的dialect为连接postgresql时的 'postgresql' 。

冲突时插入

问题描述 在使用insert语句的Insert.on_conflict_do_nothing() 函数时,会报如下错误

原因

从9.5版开始,PostgreSQL允许通过ON CONFLICT条款INSERT语句。只有当候选行不违反任何唯一约束时,才会插入该行。

在违反唯一约束的情况下,可能会发生第二个操作,该操作可以是“do update”(执行更新),表示应更新目标行中的数据,也可以是“do nothing”(不执行任何操作),表示静默跳过此行。

使用现有的唯一约束和索引确定冲突。可以使用DDL中所述的名称来标识这些约束,也可以通过声明组成索引的列和条件来推断这些约束。

SQLAlchemy提供ON CONFLICT通过特定于PostgreSQL的支持insert() 函数,提供生成方法 Insert.on_conflict_do_update() 和 Insert.on_conflict_do_nothing() 。

Vastbase连接时采用postgresql的模式,但尚未支持ON CONFLICT DO NOTHING的语法,在使用Insert.on_conflict_do_nothing()函数时会出错。

解决办法

ON CONFLICT DO NOTHING改为Vastbase相应的语法ON DUPLICATE KEY UPDATE NOTHING

打开sqlalchemy.dialects.postgresql.base.py文件,找到vistit_on_conflict_do_nothing(self,on_conflict,**kw)函数,改动如下: