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

时间:2019-09-07 15:14:37

标签: python db2 db2-luw

尝试使用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服务。

环境:

  • 2019 MacBook Pro
  • macOS v。10.14.6
  • python v。3.6.8(也尝试过3.7.4)
  • ibm_db 3.0.1版
  • conda环境(也尝试过非conda python)

我尝试过:

  • 使用pip(常规和sudo,-no-cache-dir)卸载/重新安装ibm_db
  • 将clidriver下载到其他目录并设置IBM_DB_HOME env var

执行connect方法时出现错误:

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

db2level输出

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".

2 个答案:

答案 0 :(得分:0)

该错误意味着尝试为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)

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

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

相同的代码返回:

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

答案 1 :(得分:0)

ClientWrkStnName包含无效字符,如@mao和@kkuduk建议。这是由于我的旧Mac和同一网络上的新Mac之间的Mac ComputerName冲突所致。例如格雷的MacBook Pro->格雷的MacBook Pro(2)。通过从终端在新计算机上更改ComputerName和HostName可以解决此问题。

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