跳转到主要内容

用于通过ODBC连接Django到Informix数据库的数据库驱动程序

项目描述

通过pyodbc连接Django到Informix数据库的数据库驱动程序。

一些限制:

  • 不支持默认值

  • Informix会自动在外键上创建索引,但Django会尝试手动完成;当前的实现只是尝试捕获索引创建错误。它可能会无意中捕获其他索引创建错误,其中索引已存在。

配置本地环境

应存在以下环境变量

INFORMIXDIR

Informix客户端安装目录的路径

INFORMIXSERVER

我们需要连接到的Informix服务的名称

INFORMIXSQLHOSTS

Informix驱动程序应使用的sqlhosts文件的路径

LD_LIBRARY_PATH

各种Informix库文件的路径:通常为$INFORIMIXDIR/lib:$INFORMIXDIR/lib/cli:$IMFORMIXDIR/lib/esql

DB_LOCALE

如果在连接过程中出现Database locale information mismatch.错误,您应指定数据库区域设置,例如DB_LOCALE=en_US.8859-15

您还需要在以下格式中为您需要连接的每个远程/本地Informix服务器添加sqlhosts文件中的一个条目

<INFORMIX_SERVER_NAME>    onsoctcp     <INFORMIX_HOST_NAME>    <INFORMIX_SERVICE_NAME>

例如

dev    onsoctcp    localhost    9088

您还可以在该行中使用符号名代替端口号,通常是sqlexec,然后在/etc/services文件中配置端口号

sqlexec    9088/tcp

配置settings.py

Django的settings.py使用以下方式连接到Informix数据库

'default': {
    'ENGINE': 'django_informixdb',
    'NAME': 'myproject',
    'SERVER': 'ifxserver',
    'USER' : 'testuser',
    'PASSWORD': 'passw0rd',
    'OPTIONS': {
        'DRIVER': '/path/to/iclit09b.so'. # Or iclit09b.dylib on macOS
        'CPTIMEOUT': 120,
        'CONN_TIMEOUT': 120,
        'ISOLATION_LEVEL': 'READ_UNCOMMITTED',
        'LOCK_MODE_WAIT': 0,
        'VALIDATE_CONNECTION': True,
    },
    'CONNECTION_RETRY': {
        'MAX_ATTEMPTS': 10,
    },
    'TEST': {
        'NAME': 'myproject',
        'CREATE_DB': False
    }
}
CPTIMEOUT

这将设置连接池超时。可能的值

0 - Turn off connection pooling
nn - timeout set nn seconds
CONN_TIMEOUT

这将设置对连接上的操作(连接、关闭等)的超时。可能的值

0 - Default timeout to the database (which could mean no timeout)
nn - timeout set nn seconds
ISOLATION_LEVEL

这将设置连接级别的数据库隔离级别。可能的值

READ_COMMITED
READ_UNCOMMITTED
SERIALIZABLE
LOCK_MODE_WAIT

这将设置连接级别的数据库LOCK MODE WAIT。应用程序可以使用此属性来覆盖默认的访问锁定行或表的进程。默认值是0(不等待锁定)。可能的值

-1 - WAIT until the lock is released.
0 - DO NOT WAIT, end the operation, and return with error.
nn - WAIT for nn seconds for the lock to be released.
VALIDATE_CONNECTION

是否在请求开始时验证现有连接。默认为False

VALIDATION_INTERVAL

如果启用VALIDATE_CONNECTION,则每隔多少秒重新验证连接。默认为300(5分钟)。

VALIDATION_QUERY

用于验证连接是否可用的查询。默认为“SELECT 1 FROM sysmaster:sysdual”

CONNECTION_RETRY

在打开到数据库的新连接时,如果发生错误,将自动重试最多MAX_ATTEMPTS次。只有错误代码在ERRORS中才会触发重试。重试之间的等待时间使用指数退避加抖动公式计算

random_between(WAIT_MIN, min(WAIT_MAX, WAIT_MULTIPLIER * WAIT_EXP_BASE ** (attempt - 1)))

默认值(等待时间是毫秒)

MAX_ATTEMPTS: 1  # this implies no retries
WAIT_MIN: 0
WAIT_MAX: 1000
WAIT_MULTIPLIER: 25
WAIT_EXP_BASE: 2
ERRORS: ['-908', '-930', '-27001']

每个设置都可以在settings.py中数据库配置的CONNECTION_RETRY部分中覆盖。例如

DATABASES = {
   'default': {
       'ENGINE': 'django_informixdb',
       'CONNECTION_RETRY': {
           'MAX_ATTEMPTS': 10,
           'WAIT_MIN': 0,
           'WAIT_MAX': 500,
       },
       # ...
    },
 }

默认情况下重试的错误代码对应以下错误

  • -908 连接到数据库服务器(servername)失败尝试

  • -930 无法连接到数据库服务器 servername

  • -27001 在连接尝试期间发生读取错误

这些错误通常发生在数据库服务器过于繁忙、太多客户端同时尝试连接或网络防火墙切断连接时。

与Docker Informix Dev数据库一起使用

IBM为Informix开发者数据库图像提供的docker镜像与其他图像的行为略有不同。因此,它需要一些额外的处理,并且似乎与docker-compose不兼容

首先我们需要下载并运行它

$ docker run -itd --name iif_developer_edition --privileged -p 9088:9088 -p 9089:9089 -p 27017:27017 \
-p 27018:27018 -p 27883:27883 -e LICENSE=accept ibmcom/informix-developer-database:latest

如果镜像不存在,这将下载它,然后以iif_developer_edition的名称运行它。第一次运行时,该镜像将进行一系列初始设置。由于我们使用了-d选项,它将在后台作为一个分离的进程运行。所以不用担心输出中没有任何内容。

您可以使用以下命令停止和重新启动容器:

$ docker stop iif_developer_edition
$ docker start iif_developer_edition

目前Informix ODBC驱动程序不支持创建数据库。因此,我们需要手动创建,通过连接到正在运行的容器来实现。

$ docker attach iif_developer_edition

这将为您提供正在运行的容器的shell,因此您可以使用dbaccess创建您的数据库。您可以使用Ctrl-p Ctrl-q退出此shell,而无需关闭整个容器。

此Django Informix数据库适配器要求在我们的数据库中启用事务支持。在Informix Developer镜像中,这不是默认设置。因此,您需要根据每个数据库来启用它。

$ docker attach iif_developer_edition
$ ontape -s -B <DB_NAME>

同样,您可以使用Ctrl-p Ctrl-q断开连接。

最后,您需要确保我们的本地开发数据库包含在sqlhosts文件中。例如:

dev    onsoctcp    localhost    9088

现在您应该能够使用上述语法将Django指向我们的本地测试数据库。

使用docker-compose使用Django InformixDB

通过一些努力,您可以使用docker-compose与Informix开发docker镜像。

示例docker-compose.yml

version: '3'

services:
    db:
        image: ibmcom/informix-developer-database
        tty: true # Needed to ensure container doesn't self terminate
        environment:
            LICENSE: accept
        privileged: true
        ports:
            - "9088:9088"
            - "9089:9089"
            - "27017:27017"
            - "27018:27018"
            - "27883:27883"

在组成文件中,不同于寻常的关键条目是tty: true。这为容器分配了一个(虚拟)TTY。Informix开发数据库容器期望一个tty,如果在内运行docker-compose时没有,则会终止。

使用docker-compose up启动并运行后,您可以使用以下命令在正在运行的容器上运行一个bash shell:

docker exec -it informix_db_1 bash

其中,informix_db_1是正在运行的容器的名称。从这个shell中,您可以使用dbaccess等创建您的数据库。

针对Informix数据库进行测试

由于Informix ODBC驱动程序中存在一个错误,目前无法正常运行Django测试。具体来说,Django无法创建测试数据库。因此,您需要手动完成。默认情况下,Django将尝试使用等于默认数据库名称的名称创建数据库,并带有test_前缀。例如,如果您的数据库名称是my_database,则测试数据库名称将是test_my_database。这可以通过在TEST下的NAME选项中覆盖。

要防止Django尝试创建测试数据库,请将TEST下的CREATE_DB选项设置为False:请参阅上述“配置settings.py”。

您可以按照上述“在Docker中使用Informix本地”部分中的步骤执行,然后运行测试时,可以使用-k参数告诉Django重新使用现有的数据库,而不是尝试创建一个新数据库。

./manage.py test -k

为django_informixdb开发者

要运行django_informixdb测试套件,您需要设置INFORMIXDIR环境变量,并且测试期望在主机“informix”上有一个Informix数据库。如果需要,请在test/conftest.py中更改该主机。然后使用以下命令运行测试套件:

tox

这将运行Django 3和4下的测试。

基于Docker的测试

如果您不想在本地安装Informix库和多个Python版本,那么您可以在Docker容器中进行测试。

尝试使用辅助脚本test-in-docker.sh,或者检查脚本并根据自己的需求进行调整。

要求:Docker 19.03.2 或更高版本和 Docker Compose 1.24.1 或更高版本。

发布历史

版本 1.11.4

  • 更新 pyproject.toml / setup.cfg,并将 docker 测试更新为使用 Rocky9 而不是 Centos7

版本 1.11.3

  • 从 setup.py 切换到 pyproject.toml / setup.cfg

版本 1.11.2

  • 开始支持 Python 3.10

版本 1.11.1

  • 从 TravisCI 转换到 GitHub Actions

版本 1.11.0

  • 开始支持 Django 4.x

  • 结束支持 Django 2.x

  • 结束支持 Python 3.6

版本 1.10.1

版本 1.10.0

  • 开始支持 Django 3.x

  • 开始支持 Python 3.9

版本 1.9.1

  • 开始支持 Python 3.7 和 3.8

  • 结束支持 Django 1.x 和 Python 3.5

版本 1.9.0

  • 启用设置验证间隔。

版本 1.8.0

  • 在请求开始时验证连接。

版本 1.7.0

  • 添加 CONN_TIMEOUT 设置。

版本 1.5.0

  • 如果获取连接失败,则启用重试。

版本 1.3.3

  • 兼容性修复,以从自定义字段中删除旧的“context”参数,针对 Django 2+

版本 1.3.0

  • 解决 Django 2+ 中转换函数的弃用警告

  • 更早检测错误的 INFORMIXSQLHOSTS 设置,以提供更好的错误信息

版本 1.2.0

  • 修复了 Django 2+ 下 DecimalField 处理中的错误

版本 1.1.0

  • 添加 LOCK_MODE_WAIT 选项

版本 1.0.0

  • 首次公开发布

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

django_informixdb-1.11.5.tar.gz (31.0 kB 查看哈希)

上传时间

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面