VastbaseG100

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

Menu

连接Vastbase时需注意的问题

连接

问题描述

在将settings.py文件中的数据库引擎设置为postgresql,使用Django连接Vastbase数据库时,会报如下错误:

原因

Django在连接数据库时会检索扫描数据库中存在的表,inspectdb时扫描了relispartition这个参数的值,但是relispartition是在PostgreSQL 10引入的,Vastbase是基于Postgre SQL 9.2.4,尚未这个参数,所以报错。此外,Vastbase没有兼容with ordinality语法,需将其改为相应的窗口函数row_number()。

解决办法

如果在连接数据库时不想使用Vastbase提供的Django源码包,也可根据以下步骤自行修改源码,以适配Vastbase。

1、复制django.db.backends下的postgresql文件夹并重命名为vastbase,这是为了同时兼容PostgreSQL和Vastbase。

2、将Postgresql中查表时检测分区表relispartition属性改为Vastbase判断分区表的属性parttype,打开django.db.backends.vastbase.introspection.py文件:

(1)找到get_table_list(self, cursor)函数,修改其执行的SQL语句,改动如下:

(2)找到get_table_description(self, cursor,table_name)函数,修改其执行的SQL语句,改动如下:

3、Vastbase没有兼容with ordinality语法,将其改为相应的窗口函数row_number()

(1)找到get_constraints(self, cursor, table_name)函数,修改其执行的SQL语句,改动如下:

冲突时插入

问题描述

在使用bulk_create()函数批量插入值时,若将 ignore_conflicts 参数设置为 True代表 告诉数据库忽略插入任何不合格的约束条件的行,如重复的唯一值。此时会报如下错误:

原因

PostgreSQL的ON CONFLICT DO NOTHING语法在Vastbase未支持。

解决办法

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

打开django.db.backends.vastbase.operations.py文件,找到ignore_conflicts_suffix_sql(self,ignore_conflicts=None) 函数,改动如下: