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)
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)
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)
#-*-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)
注意事项:
- 就是一定记得要关闭连接。
- 读取数据只能一行一行读取,需要
result = ibm_db.fetch_both(stmt)
代码在调下一行