本文中的示例代码:
- 连接DB2数据库
- 执行select语句
- 结果集为字典格式,获取key、value,并使用join方法按照分隔符进行拼接
- 最终生成语句为查询表的insert数据
- 将结果写入到文件
DB2提取查询结果有四种方式
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) 注: ibm_db没办法一次提取多行,提取多行数据,需要循环提取
示例代码:
# -*- coding:utf-8 -*- import os import ibm_db # 数据库连接信息 db_url = "DATABASE=moiac;SCHEMA=moiase;HOSTNAME=199.188.166.110;PORT=60000;PROTOCOL=TCPIP;UID=moiase;PWD=moiase;" # 要查询的表名 tab_name = "t04_job_param" # 结果文件 file_name = "%s.sql" % (tab_name) # 删除已存在的文件 if os.path.exists(file_name): os.remove(file_name) # 查询sql select_sql = """select * from %s""" % (tab_name) # 连接数据库执行sql获取数据 try: # 连接数据库 conn = ibm_db.connect(db_url, "", "") # 关闭自动提交 ibm_db.autocommit(conn, ibm_db.SQL_AUTOCOMMIT_OFF) # 执行SQL语句 stmt = ibm_db.exec_immediate(conn, select_sql) res = ibm_db.fetch_assoc(stmt) # res=ibm_db.fetch_both(stmt) # res = ibm_db.fetch_tuple(stmt) # 计数器 num = 0 while (res): num += 1 print("第" + str(num) + "行") # print(res) # for key,item in res: # print() key = ','.join(str(k) for k in res.keys()) val = ','.join( '\'' + str(v) + '\'' if isinstance(v, str) # or isinstance(v,unicode) # or isinstance(v,datetime.datetime) else str(v) for v in res.values()) # print(key) # print(val) ins_str = "insert into %s (%s) values (%s);" % (tab_name, key, val) with open(file_name, 'a') as file: file.write(ins_str + "\n") file.close() # res=ibm_db.fetch_tuple(stmt) # res = ibm_db.fetch_both(stmt) res = ibm_db.fetch_assoc(stmt) print(("%s生成完成, 共%s条数据") % (tab_name, num)) # 提交事务 ibm_db.commit(conn) except Exception as e: # 回滚事务 print(e) ibm_db.rollback(conn) finally: # 关闭数据库连接 ibm_db.close(conn)