在Pandas中使用IBM_DB

4 投票
4 回答
13963 浏览
提问于 2025-05-10 15:26

我正在尝试在Python语言中使用数据分析工具Pandas。我想通过ibm_db这个包从IBM数据库读取数据。根据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),并在处理完数据后再写回数据库。

从数据库获取数据的代码:

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

相关文章:

  • 暂无相关问题
暂无标签

4 个回答

0

你可以这样使用 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)
0

你可以去看看这个链接:https://pypi.python.org/pypi/ibmdbpy

它提供了一种类似Pandas的接口,但不需要把所有数据都加载到Python的内存里。

文档在这里:http://pythonhosted.org/ibmdbpy/index.html。这里有个快速演示,教你如何在Bluemix Notebooks中使用它:https://www.youtube.com/watch?v=tk9T1yPkn4c

1

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这种时候,我们需要找到问题的根源,看看是什么导致了这些错误。

通常,我们可以通过查看错误信息来帮助我们理解问题。错误信息就像是程序给我们的提示,告诉我们哪里出错了,或者是哪个部分的代码需要修正。

此外,调试工具也是很有帮助的。调试工具可以让我们逐行检查代码,看看每一步的执行情况,帮助我们找到问题所在。

总之,遇到问题时,不要慌张,仔细查看错误信息和使用调试工具,通常都能找到解决办法。

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()
20

在进一步研究这个软件包时,我发现我需要把IBM_DB连接对象放在一个ibm_db_dbi连接对象里,这个对象是属于https://pypi.org/project/ibm-db/这个软件包的。

所以

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

上面的代码可以正常工作,pandas成功地把数据提取到数据框中。

撰写回答