Db2

python ibm_db 驅動程序和十進制值?

  • April 27, 2018

似乎十進制值被 ibm_db 視為字元串。小例子:

Python 2.7.14(預設,2018 年 3 月 14 日,13:36:31)

$$ GCC 7.3.1 20180303 (Red Hat 7.3.1-5) $$在linux2上

]$ cat aa.py 
#!/usr/bin/python

import sys
import ibm_db

conn = ibm_db.connect("dsn=sample","********","********")
s1 = ibm_db.prepare(conn, "values (cast(1 as int),cast(0.1 as decimal(2,1)))")
ibm_db.execute(s1)
d1 = ibm_db.fetch_both(s1)
print d1[0], type(d1[0]), d1[1], type(d1[1])

輸出:

1 <type 'long'> 0.1 <type 'str'>

我將 dict 作為 JSON 轉儲到文件中(對於 filebeat -> logstash),所以我真的需要數字類型來保持數字。我想我可以檢查類型的準備好的語句(那裡的類型是正確的)並在轉儲之前按摩數據,但這似乎非常錯誤。

關於如何以最簡單的方式將數字數據放入 JSON 對象的任何想法?

我發現了以下 3 年的提及:

https://github.com/ibmdb/python-ibmdb/issues/129

這個限制還在起作用嗎?

我不確定它是否應該工作,在

https://github.com/ibmdb/python-ibmdb/issues/129

它說:

“這是目前 ibm_db 驅動程序的限制,因為缺少 python 的 Decimal 對象的 C API,但是您將通過 ibm_db_dbi 包裝器獲得十進制對象。”

我使用了以下解決方法:

import ibm_db
import ibm_db_dbi
[...]
ibm_db_conn = ibm_db.connect("DATABASE=%s;HOSTNAME=%s;PORT=%d;PROTOCOL=TCPIP;UID=%s; PWD=%s" % (dbname, host, port, user, passwd),"","")
conn = ibm_db_dbi.Connection(ibm_db_conn)
c1 = conn.cursor()
c1.execute("values (cast(1 as int),cast(0.1 as decimal(2,1)))")
row = c1.fetchone()
if row == None:
   sys.exit(1)

# Manually create a dictionary
rowDict = dict(zip([c[0] for c in c1.description], row))
print rowDict
{'1': 1, '2': Decimal('0.1')}

引用自:https://dba.stackexchange.com/questions/205099