db2 将IBM_DB与Pandas一起使用

zrfyljdw  于 2022-11-07  发布在  DB2
关注(0)|答案(4)|浏览(396)

我正在尝试使用Python语言的数据分析工具Pandas。我正在尝试使用ibm_db包从IBM DB读取数据。根据Pandas网站中的文档,我们需要提供至少两个参数,一个是要执行的sql,另一个是数据库的连接对象。但当我这样做时,它给我一个错误,即连接对象中没有cursor()方法。我想这可能不是这个特定的数据库包的工作方式。我试图找到一些变通办法,但没有成功。
编码:

print "hello PyDev"
con = db.connect("DATABASE=db;HOSTNAME=localhost;PORT=50000;PROTOCOL=TCPIP;UID=admin;PWD=admin;", "", "")
sql = "select * from Maximo.PLUSPCUSTOMER"
stmt = db.exec_immediate(con,sql)
pd.read_sql(sql, db)
print "done here"

错误:

hello PyDev
Traceback (most recent call last):
  File "C:\Users\ray\workspace\Firstproject\pack\test.py", line 15, in <module>
    pd.read_sql(sql, con)
  File "D:\etl\lib\site-packages\pandas\io\sql.py", line 478, in read_sql
    chunksize=chunksize)
  File "D:\etl\lib\site-packages\pandas\io\sql.py", line 1504, in read_query
    cursor = self.execute(*args)
  File "D:\etl\lib\site-packages\pandas\io\sql.py", line 1467, in execute
    cur = self.con.cursor()
AttributeError: 'ibm_db.IBM_DBConnection' object has no attribute 'cursor'

如果我从数据库中提取数据,我可以提取数据,但我需要读入 Dataframe ,并需要在处理数据后写回数据库。
用于从DB中提取的代码

stmt = db.exec_immediate(con,sql)
 tpl=db.fetch_tuple(stmt)
 while tpl:
     print(tpl)
     tpl=db.fetch_tuple(stmt)
ztyzrc3y

ztyzrc3y1#

在进一步研究该包时,我发现需要将IBM_DB连接对象 Package 在ibm_db_dbi连接对象中,该对象是https://pypi.org/project/ibm-db/包的一部分。
所以

conn = ibm_db_dbi.Connection(con)
df = pd.read_sql(sql, conn)

上面的代码可以正常工作,并成功地将数据提取到dataframe中。

5f0d552i

5f0d552i2#

您还可以查看https://pypi.python.org/pypi/ibmdbpy
它提供了Pandas风格的API,而无需将所有数据提取到Python内存中。
文档位于:http://pythonhosted.org/ibmdbpy/index.html以下是如何在Bluemix笔记本电脑中使用它的快速演示:https://www.youtube.com/watch?v=tk9T1yPkn4c

ctrmrzij

ctrmrzij3#

您可以像这样使用ibm_db_dbi.connect(已测试)

import ibm_db_dbi
import pandas as pd

config = {
  'database:xxx, 'hostname':xxx, 'port': xxx, 
  'protocol':xxx, 'uid': xxx, 'password': xxx
}
conn = ibm_db_dbi.connect(
  'database={database};'
  'hostname={hostname};'
  'port={port};'
  'protocol={protocol};'
  'uid={uid};'
  'pwd={password}'.format(**config), '', '')

sql = 'select xxxx from xxxx'
df = pd.read_sql(sql, conn)
bhmjp9jg

bhmjp9jg4#

from ibm_db import connect
import pandas as pd
import ibm_db_dbi
cnxn = connect('DATABASE=YourDatabaseName;'
                 'HOSTNAME=YourHost;'  # localhost would work 
                 'PORT=50000;'
                 'PROTOCOL=TCPIP;'
                 'UID=UserName;'
                 'PWD=Password;', '', '')
sql = "SELECT * FROM Maximo.PLUSPCUSTOMER"
conn=ibm_db_dbi.Connection(cnxn)
df = pd.read_sql(sql, conn)
df.head()

相关问题