Python操作DB2数据库
本文中的示例代码:
- 连接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)