Django、Informix、ibm_db 和 DB2 数据服务器驱动程序

Posted

技术标签:

【中文标题】Django、Informix、ibm_db 和 DB2 数据服务器驱动程序【英文标题】:Django, Informix, ibm_db and DB2 data server driver 【发布时间】:2013-03-04 12:26:19 【问题描述】:

我正在尝试使用 IBM DB2 数据服务器驱动程序 (ODBC)(v10.1) 和 ibm_db (https://code.google.com/p/ibm-db/) 从 django(v1.3.1) 连接到 IDS(v11.50)。从 django 到驱动程序的简单查询(例如“从 adm_audit 中选择不同的 adm_audit.action”)传输到 select distinct "adm_audit"."action" from "adm_audit" 并生成错误:

[IBM][CLI Driver][IDS/UNIX64] A syntax error has occurred.

我尝试在 db2cli 中执行相同的 sql 语句,它返回相同的错误:

    >select distinct "adm_audit"."action" from "adm_audit"
    select distinct "adm_audit"."action" from "adm_audit"
    SQLError: rc = 0 (SQL_SUCCESS)
    SQLGetDiagRec: SQLState     : 42000
              fNativeError : -201
              szErrorMsg   : [IBM][CLI Driver][IDS/UNIX64] A syntax error has occurred.
              cbErrorMsg   : 58

如果引号被删除,语句成功完成:

    > select distinct adm_audit.action from adm_audit
    select distinct adm_audit.action from adm_audit
    FetchAll:  Columns: 1
      action
       ...results...
    FetchAll: 13 rows fetched.

阿努的建议? 感谢任何帮助。

问题解决了。

1) DELIMIDENT 变量

2) 从 ibm_db_django -> operation.py 大约 176 行更改,字符串

"name = upper( name )"

"name = lower( name )"

(并从字符串类导入 `lower')

【问题讨论】:

您是否能够从 Informix 工具(如 dbaccessdbaccess)运行此类查询? 同样的结果。 201: A syntax error has occurred.select distinct "adm_audit"."action" from "adm_audit" 之后。看来,这是 ibm_db 的麻烦。 默认情况下,Informix 可以识别字符串周围的'" 引号(当然,它们的两端必须相同)。要将双引号字符串识别为分隔标识符,您必须强制使用 DELIMIDENT 环境变量或 API 连接字符串中的等效设置。一旦会话正在进行,该设置将无法更改。 【参考方案1】:

有环境变量DELIMIDENT可以控制双引号的使用。将其设置为 y 以仅在分隔的 SQL 标识符周围使用它。

更多信息:http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqls.doc/sqls1077.htm

我使用 ODBC 和 JDBC 对其进行了测试,对于SELECT * FROM "aaa",它的工作原理相同:

未设置DELIMIDENT,默认设置DELIMIDENT=n:错误 使用DELIMIDENT=y 设置:查询有效

【讨论】:

非常感谢,但这只是问题的一半。现在我发现,Informix 之前的 v11.70xC2 不支持不区分大小写的数据库,因此它会以大写形式显示表名字符串(用引号括起来)的错误。【参考方案2】:

我在 Informix 上摆弄了一下 ibm_db_django。

结果可以在这里找到:https://github.com/nutztherookie/ibm_db_django

它并不完美,但它确实支持inspectdb,例如:)

【讨论】:

以上是关于Django、Informix、ibm_db 和 DB2 数据服务器驱动程序的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 上使用 pyodbc 连接到 Informix

使用 django 连接到旧版 informix 数据库

python操作db2和mysql ,ibm_db

Python 3和IBM_DB安装问题

离线安装db2的python模块ibm_db

python用ibm_db模块操作db2