2022年 11月 3日

Python连接DB2数据库

python版本为3.5

  1. 导入IBM的数据包: Python Package Index 解压后 ibm_db
  2. 下载db2驱动 clidriver 解压后得到clidriver目录
  3. 将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

注意事项

  1. 就是一定记得要关闭连接。
  2. 读取数据只能一行一行读取,需要result = ibm_db.fetch_both(stmt) 代码在调下一行