Python ibm_db 异常:[IBM][CLI 驱动程序] SQL4917N 选项数组中的元素 "SQLE_CLIENT_INFO_WRKSTNNAME" 无效。 SQLCODE=-4917

Python ibm_db Exception: [IBM][CLI Driver] SQL4917N Element "SQLE_CLIENT_INFO_WRKSTNNAME" in the option array is not valid. SQLCODE=-4917

尝试使用 ibm_db python 程序包连接到 db2 时出现以下错误。

[IBM][CLI Driver] SQL4917N  Element "SQLE_CLIENT_INFO_WRKSTNNAME" 
in the option array is not valid. SQLCODE=-4917

这个问题是我的新机器(2019 MacBook Pro)特有的。我从旧机器(2013 年末的 MacBook Pro)的 Time Machine 备份设置了这台机器。完全相同的代码能够在我的旧机器上无错误地连接到数据库。新机器可以使用SQLDeveloper程序连接数据库但不能python.

在不同的服务器上尝试不同的数据库时,错误仍然存​​在。我正在尝试连接到 Db2 Warehouse on Cloud 服务。

环境:

我试过:

执行连接方法时出现错误:

import ibm_db
conn = ibm_db.connect(CONN_STRING, "", "")

此时,我希望python连接到数据库,但我得到以下错误:

[IBM][CLI Driver] SQL4917N  Element "SQLE_CLIENT_INFO_WRKSTNNAME" 
in the option array is not valid. SQLCODE=-4917

db2level 命令

~/anaconda3/envs/ibm/lib/python3.6/site-packages/clidriver/bin/db2level

db2级输出

DB21085I  This instance or install (instance name, where applicable: "*") uses
"64" bits and DB2 code release "SQL10055" with level identifier "0606010E".
Informational tokens are "DB2 v10.5.0.5", "special_35187", "DARWIN64105_35187",
and Fix Pack "5".
Product is installed at
"~/anaconda3/envs/ibm/lib/python3.6/site-packages/clidriver".

该错误表明曾试图为 SQLE_CLIENT_INFO_WRKSTNNAME 设置无效值。 Db2 cloud 应该接受最多 255 个字节的值,并且它应该默认为当前主机名,所以 gethostbyname 可能返回了一些无效字符? 确认我们必须在执行期间收集 db2cli 跟踪(以查看它尝试设置的实际值)。

要测试的最简单 Python 代码是 运行

import ibm_db
conn = ibm_db.connect("SAMPLE","db2v111","passw0rd")
stmt = ibm_db.exec_immediate(conn,"select CURRENT client_wrkstnname  from sysibm.sysdummy1")
ibm_db.fetch_tuple(stmt)

对我来说,连接工作正常,它 returns 我当前的主机名:

In [6]: ibm_db.fetch_tuple(stmt)
Out[6]: (u'kkuduk',)

您要测试的解决方法是在 db2cli.ini 中放置一些其他值,例如如果我设置:

cat /usr/lib/python2.7/site-packages/ibm_db-2.0.7-py2.7-linux-x86_64.egg/clidriver/cfg/db2cli.ini
[sample]
port=60111
hostname=localhost
database=sample
ClientWrkStnName=OverridenHostname

同样的代码returns:

In [4]: ibm_db.fetch_tuple(stmt)
Out[4]: (u'OverridenHostname',)

正如@mao 和@kkuduk 所建议的,ClientWrkStnName 包含无效字符。这是由于同一网络上我的旧 Mac 和新 Mac 之间的 Mac ComputerName 冲突造成的。前任。 Gray 的 MacBook Pro -> Gray 的 MacBook Pro (2)。通过从终端更改新计算机上的 ComputerName 和 HostName 解决了该问题。

scutil --set ComputerName "graymac"
scutil --set HostName "graymac"