连接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)
函数,改动如下: