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