用于通过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 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0e67bdf0365765d9c2ab7241cd0b706a64dcb05da9ec6223dbac03673bfc03ca |
|
MD5 | 724e3c9401bb9674c93e4da8eec5b3e7 |
|
BLAKE2b-256 | a4ab6db09eb9d6ac2547ca603cf4d3f4414de636fbca471a89dc16739307a755 |