使用 IBM_DB 和 Pandas
Using IBM_DB with Pandas
我正在尝试使用 Python 语言的数据分析工具 Pandas。我正在尝试使用 ibm_db 包从 IBM DB 读取数据。根据 Pandas 网站上的文档,我们需要提供至少 2 个参数,一个是将要执行的 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'
如果我从数据库中获取数据,我可以获取数据,但我需要读入数据框,并需要在处理数据后写回数据库。
从数据库中获取的代码
stmt = db.exec_immediate(con,sql)
tpl=db.fetch_tuple(stmt)
while tpl:
print(tpl)
tpl=db.fetch_tuple(stmt)
在进一步研究包时,我发现我需要将 IBM_DB 连接对象包装在 ibm_db_dbi 连接对象中,它是 https://pypi.org/project/ibm-db/ 包的一部分。
所以
conn = ibm_db_dbi.Connection(con)
df = pd.read_sql(sql, conn)
以上代码有效,pandas 成功将数据提取到数据框中。
你也可以看看https://pypi.python.org/pypi/ibmdbpy
它提供 Pandas 风格 API 而无需将所有数据拉出到 Python 内存中。
文档在这里:http://pythonhosted.org/ibmdbpy/index.html
下面是一个如何在 Bluemix Notebooks 中使用它的快速演示:
https://www.youtube.com/watch?v=tk9T1yPkn4c
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()
您可以像这样使用 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)
我正在尝试使用 Python 语言的数据分析工具 Pandas。我正在尝试使用 ibm_db 包从 IBM DB 读取数据。根据 Pandas 网站上的文档,我们需要提供至少 2 个参数,一个是将要执行的 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'
如果我从数据库中获取数据,我可以获取数据,但我需要读入数据框,并需要在处理数据后写回数据库。
从数据库中获取的代码
stmt = db.exec_immediate(con,sql)
tpl=db.fetch_tuple(stmt)
while tpl:
print(tpl)
tpl=db.fetch_tuple(stmt)
在进一步研究包时,我发现我需要将 IBM_DB 连接对象包装在 ibm_db_dbi 连接对象中,它是 https://pypi.org/project/ibm-db/ 包的一部分。
所以
conn = ibm_db_dbi.Connection(con)
df = pd.read_sql(sql, conn)
以上代码有效,pandas 成功将数据提取到数据框中。
你也可以看看https://pypi.python.org/pypi/ibmdbpy
它提供 Pandas 风格 API 而无需将所有数据拉出到 Python 内存中。
文档在这里:http://pythonhosted.org/ibmdbpy/index.html 下面是一个如何在 Bluemix Notebooks 中使用它的快速演示: https://www.youtube.com/watch?v=tk9T1yPkn4c
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()
您可以像这样使用 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)