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 工具(如dbaccess
dbaccess
)运行此类查询?
同样的结果。 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 数据服务器驱动程序的主要内容,如果未能解决你的问题,请参考以下文章