arm架构,django4.2.7适配达梦8数据库

2024-04-23 08:04

本文主要是介绍arm架构,django4.2.7适配达梦8数据库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【Python相关包版本信息】

Django                        4.2.7
django-dmPython               3.1.7
dmPython                      2.5.5

【达梦数据库版本】

DM Database Server 64 V8
DB Version: 0x7000c

适配过程中发现的问题如下:

错误一:django.core.exceptions.ImproperlyConfigured: 'django_dmPython' isn't an available database backend or couldn't be imported. Check the above exception. To use one of the built-in backends, use 'django.db.backends.XXX', where XXX is one of: 'mysql', 'oracle', 'postgresql', 'sqlite3'

解决方法:将django_dmPython和django_dmPython-3.1.7.dist-info复制一份,放到django下面的db/backends/目录下,因此后面发现与此包相关的问题,需要修改2处。

错误二-1:ImportError: cannot import name 'force_text' from 'django.utils.encoding' (/usr/local/python/lib/python3.12/site-packages/django/utils/encoding.py). Did you mean: 'force_bytes'?

修改django/db/backends/django_dmPython/base.py,将18行中的force_text去掉,因为在代码中没有被调用。

###你也可以在django/utils/encoding.py文件中添加此函数,这样修改后,就可以忽略错误二-2、错误二-3。

老版本django中的force_text函数的定义如下:

def force_text(s, encoding='utf-8', strings_only=False, errors='strict'):

    warnings.warn(

        'force_text() is deprecated in favor of force_str().',

        RemovedInDjango40Warning, stacklevel=2,

    )

    return force_str(s, encoding, strings_only, errors)

错误二-2:ImportError: cannot import name 'force_text' from 'django.utils.encoding' (/usr/local/python/lib/python3.12/site-packages/django/utils/encoding.py). Did you mean: 'force_bytes'?

修改django/db/backends/django_dmPython/operations.py文件,将前面的import导入的force_text去掉,同时将下面的调用修改为force_str(2处)。

错误二-3:ImportError: cannot import name 'force_text' from 'django.utils.encoding' (/usr/local/python/lib/python3.12/site-packages/django/utils/encoding.py). Did you mean: 'force_bytes'?

修改django/db/backends/django_dmPython/utils.py文件,将前面的import导入的force_text去掉,同时将下面的调用修改为force_str(1处)

错误三、ImportError: cannot import name 'Random' from 'django.db.models.expressions' (/usr/local/python/lib/python3.12/site-packages/django/db/models/expressions.py)

老版本django中的Random类的定义如下:

class Random(Expression):

    output_field = fields.FloatField()

    def __repr__(self):

        return "Random()"

    def as_sql(self, compiler, connection):

        return connection.ops.random_function_sql(), []

修改方法:修改django/db/models/expressions.py文件,在代码最后面,增加上述定义。(不要尝试将其加入到django_dmPython/compiler.py,因为上面这个类又调用了Expression,比较麻烦。

错误四:django.core.exceptions.FullResultSet

解决方法:修改django/db/models/sql/where.py,将175和176行注释掉(这样修改肯定不对,不过目前暂未发现影响,后期发现了再改)

错误五:AttributeError: 'Query' object has no attribute 'explain_query'

解决方法:修改django_dmPython/compiler.py,将300-304行注释掉(这样修改肯定不对,不过目前暂未发现影响,后期发现了再改,不过应该影响不大,这个应该是生成explain查询sql语句性能的动作)

老版本/django/db/models/sql/query.py代码中定义了explain_query变量,在Query类中的__init__函数中定义此变量,赋默认值为False;在函数explain中将其值修改为了explain了。

错误六:Invalid column name [AAAAAAAAAAAAAAAAAC]

这个问题是达梦驱动的问题,直接按照下面修改就行。

解决方法:修改django_dmPython/operations.py中的last_insert_id函数,参考如下写法。

def last_insert_id(self, cursor, table_name, pk_name):

        """

        Given a cursor object that has just performed an INSERT statement into

        a table that has an auto-incrementing ID, returns the newly created ID.

        This method also receives the table name and the name of the primary-key

        column.

        """

        # sq_name = self._get_sequence_name(table_name)

        # cursor.execute('SELECT "%s".currval FROM dual' % sq_name)

        if cursor.lastrowid is not None:

            lastrowid=cursor.lastrowid

            rowid_dict = {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9,

                                  'K': 10, 'L': 11,

                                  'M': 12, 'N': 13, 'O': 14, 'P': 15, 'Q': 16, 'R': 17, 'S': 18, 'T': 19, 'U': 20,

                                  'V': 21, 'W': 22,

                                  'X': 23, 'Y': 24, 'Z': 25, 'a': 26, 'b': 27, 'c': 28, 'd': 29, 'e': 30, 'f': 31,

                                  'g': 32, 'h': 33,

                                  'i': 34, 'j': 35, 'k': 36, 'l': 37, 'm': 38, 'n': 39, 'o': 40, 'p': 41, 'q': 42,

                                  'r': 43, 's': 44,

                                  't': 45, 'u': 46, 'v': 47, 'w': 48, 'x': 49, 'y': 50, 'z': 51, '0': 52, '1': 53,

                                  '2': 54, '3': 55,

                                  '4': 56, '5': 57, '6': 58, '7': 59, '8': 60, '9': 61, '+': 62, '/': 63}

            rowid_temp = 0

            for i in lastrowid[-8:]:

                rowid_temp = rowid_temp * 64 + rowid_dict[i]

            lastrowid=rowid_temp

            query = 'select %s from %s where rowid = %s' %(self.quote_name(pk_name), self.quote_name(table_name), lastrowid)

            cursor.execute(query)

        else:

            cursor.execute('SELECT MAX(%s) from %s' %(self.quote_name(pk_name), self.quote_name(table_name)))

           

        value = cursor.fetchone()[0]

        return value

错误七、TypeError: DatabaseSchemaEditor._alter_column_type_sql() takes 5 positional arguments but 7 were given

上图是新老版本的_alter_column_type_sql的函数定义,发现多了2个参数,分别是old_collation, new_collation。这2个参数在函数体内调用如下:

可以很容易定位到_collate_sql函数,后面2个参数压根未使用,只是使用了collation,也就是new_collation参数,这个函数的作用是字符集排序;

查看django_dmPython/schema.py中的_alter_column_type_sql函数,在参数中添加2个参数,这2个参数暂时先不用,后面有问题再处理(可以参考django/db/backends/postgresql/schema.py或django/db/backends/mysql/schema.py中同名函数的实现逻辑)。

这篇关于arm架构,django4.2.7适配达梦8数据库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/928231

相关文章

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

mysql数据库重置表主键id的实现

《mysql数据库重置表主键id的实现》在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,本文主要介绍了mysql数据库重置表主键id的实现,具有一定的参考价值,感兴趣的可以了... 目录关键语法演示案例在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,当我们

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)