python版本为3.5
- 导入IBM的数据包: Python Package Index 解压后 ibm_db
- 下载db2驱动 clidriver 解压后得到clidriver目录
- 将clidriver复制到ibm_db目录,进入ibm_db目录,执行
python setup.py install
即可
ibm_db有两种执行方式
# 1、采用立即执行的方式,不支持?占位符,只能采取拼接字符串的方式,且字符串类型的数据一定要有单引号
sql = "SELECT * FROM TAB_USER WHERE MOBILE = '%s';"%"13911111111"
stmt = ibm_db.exec_immediate(conn, sql)
result = ibm_db.fetch_both(stmt) # 提取结果
print(result)
# 2、采用预编译的方式,支持 ? 占位符
sql = "SELECT * FROM TAB_USER WHERE MOBILE= ?"
sql_args = ("13911111111",)
stmt = ibm_db.prepare(conn, sql) # 预编译
ibm_db.execute(stmt, sql_args) # 执行
result = ibm_db.fetch_row(stmt)
print(result)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
import ibm_db
# 连接字符串
connStr = "DATABASE=TEST;HOSTNAME=192.168.0.1;PORT=50000;PROTOCOL=TCPIP;UID=username;PWD=password;"
conn = None
try:
# 连接数据库
conn = ibm_db.connect(connStr, "", "")
# 关闭自动提交
ibm_db.autocommit(conn, ibm_db.SQL_AUTOCOMMIT_OFF)
# 以插入语句为例,删除和更新只需要替换语句即可
sql = "insert into tab_A values('%s', '%s')" % (1, "Jet")
# 执行SQL语句
stmt = ibm_db.exec_immediate(conn, sql)
# 获取受影响的行数
rows = ibm_db.num_rows(stmt)
# 提交事务
ibm_db.commit(conn)
except Exception as ex:
# 回滚事务
ibm_db.rollback(conn)
finally:
# 关闭数据库连接
ibm_db.close(conn)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
ibm_db没办法一次提取多行,提取多行数据,需要循环提取。提取查询结果有四种方式:
# 1.先调用fetch_row(stmt),有结果返回true否则返回false,再调用ibm_db.result(stmt, col_idx)提取结果
ibm_db.fetch_row(stmt)
result = ibm_db.result(stmt, 0)
#2.调用fetch_both(stmt)提取一行,返回的结果是一个字典,取值可以用列名或索引 result["MOBILE"]或 result[0]
result = ibm_db.fetch_both(stmt)
3.调用fetch_assoc(stmt)提取一行,返回的是一个字典,取值只能用列明 result["MOBILE"]
result = ibm_db.fetch_assoc(stmt)
#4.调用fetch_tuple(stmt)提取一行,返回的是一个元组,取值只能用索引 result[0]
result = ibm_db.fetch_tuple(stmt)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
#-*-coding-*-
import ibm_db
import time
conn = ibm_db.connect("DATABASE=EDW;HOSTNAME=输入IP;PORT=端口;PROTOCOL=通信协议;UID=用户名;PWD=密码;", "", "")
#print(conn)
if conn:
#写一条查询语句
sql = "Select A,B,C from CC.ABC"
stmt = ibm_db.exec_immediate(conn,sql)
result = ibm_db.fetch_both(stmt)
for i in range(len(result)):
print("第一个字段:",result[0]+'\n'+"第二个字段:",result[1]+'\n'+"第三个字段",result[2])
print('----------------')
#停止0.5秒输出
time.sleep(0.5)
result = ibm_db.fetch_both(stmt)
#最后记得关闭数据库连接
ibm_db.close(conn)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
注意事项:
- 就是一定记得要关闭连接。
- 读取数据只能一行一行读取,需要
result = ibm_db.fetch_both(stmt)
代码在调下一行