Db2
python ibm_db 驅動程序和十進制值?
似乎十進制值被 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')}