官方文档:https://www.ibm.com/support/knowledgecenter/en/SSEPGG_9.5.0/com.ibm.db2.luw.apdv.python.doc/doc/t0054682.html

import ibm_db
conn = ibm_db.connect("database=MICRO_11; "
"hostname=localhost; "
"port=50000; "
"protocol=tcpip; "
"uid=administrator; "
"pwd=wyz", "", "")
stmt = ibm_db.exec_immediate(conn,"SELECT SYS_ORG_TYPE_CODE,SYS_ORG_TYPE_NAME "
"FROM SYS_ORG_TYPE_TB "
"WHERE SYS_ORG_TYPE_UPID IS NOT NULL")
# if结果集条数为0:result==False
# if结果集条数>0:结果为一个tuple
result = ibm_db.fetch_tuple(stmt)
while result:
print(result[0], result[1]) # 顺序和select字段顺序一样
result = ibm_db.fetch_tuple(stmt)

一、建连接:

'''
ibm_db.connect() #非持久性连接
ibm_db.pconnect() #持久性连接,提升性能,连接不关闭
'''
import ibm_db
conn = ibm_db.connect("dsn=name","username","password")
#连接cataloged或非cataloged数据库
ibm_db.connect("DATABASE=name;HOSTNAME=host;PORT=60000;PROTOCOL=TCPIP;UID=username;
PWD=password;", "", "")

二、执行SQL:

不带参数的

'''
string可以为XQuery表达式,用XMLQuery包装的
如果将用户输入作为SQL变量,可能受到SQL注入攻击
返回的是cursor类型,调用 ibm_db.num_rows()可以得到影响的数据行数
如果执行错误,可通过ibm_db.stmt_error() 或 ibm_db.stmt_errormsg()得到错误信息
'''
import ibm_db
conn = ibm_db.connect("dsn=name","username","password")
stmt = ibm_db.exec_immediate(conn, "UPDATE employee SET bonus = '1000' WHERE job = 'MANAGER'")
print "Number of affected rows: ", ibm_db.num_rows(stmt)
# XQuery
if conn:
sql = "SELECT XMLSERIALIZE(XMLQUERY('for $i in $t/address where $i/city = \"Olathe\" return <zip>{$i/zip/text()}</zip>' passing c.xmlcol as \"t\") AS CLOB(32k)) FROM xml_test c WHERE id = 1"
stmt = ibm_db.exec_immediate(conn, sql)
result = ibm_db.fetch_both(stmt)
while( result ):
print "Result from XMLSerialize and XMLQuery:", result[0]
result = ibm_db.fetch_both(stmt)

带参数的:

'''
ibm_db.prepare(), ibm_db.bind_param(),ibm_db.execute()三个方法
准备语句可以提高性能,因为数据库服务器为数据检索创建了优化的访问计划,如果再次执行该语句,则可以重用它
'''
import ibm_db
conn = ibm_db.connect("dsn=name","username","password")
sql = "SELECT EMPNO, LASTNAME FROM EMPLOYEE WHERE EMPNO > ? AND EMPNO < ?"
stmt = ibm_db.prepare(conn, sql)
max = 50
min = 0
# 绑定参数
ibm_db.bind_param(stmt, 1, min)
ibm_db.bind_param(stmt, 2, max)
ibm_db.execute(stmt)
# Process results # Invoke prepared statement again using dynamically bound parameters
param = max, min,
ibm_db.execute(stmt, param)

三、检索结果集:ibm_db.fetch_both(stmt,num) 如果指定游标为scrollable类型,【在调用ibm_db.exec_immediate()或ibm_db.prepare()的时候】,num为检索的行数

import ibm_db
# 第一种方式:
conn = ibm_db.connect( "dsn=name", "username", "password" )
sql = "SELECT * FROM EMPLOYEE"
stmt = ibm_db.exec_immediate(conn, sql)
dictionary = ibm_db.fetch_both(stmt)
while dictionary != False:
print "The ID is : ", dictionary["EMPNO"]
print "The Name is : ", dictionary[1]
dictionary = ibm_db.fetch_both(stmt)
# 第二种方式:
tuple = ibm_db.fetch_tuple(stmt)
while tuple != False:
print "The ID is : ", tuple[0]
print "The name is : ", tuple[1]
tuple = ibm_db.fetch_tuple(stmt)
# 第三种方式:
dictionary = ibm_db.fetch_assoc(stmt)
while dictionary != False:
print "The ID is : ", dictionary["EMPNO"]
print "The name is : ", dictionary["FIRSTNME"]
dictionary = ibm_db.fetch_assoc(stmt)
# 第四种方式:
while ibm_db.fetch_row(stmt) != False:
print "The Employee number is : ", ibm_db.result(stmt, 0)
print "The Name is : ", ibm_db.result(stmt, "NAME")

四、调用存储过程

import ibm_db

conn = ibm_db.connect("dsn=sample","username","password")
if conn:
sql = 'CALL match_animal(?, ?, ?)'
stmt = ibm_db.prepare(conn, sql) name = "Peaches"
second_name = "Rickety Ride"
weight = 0
ibm_db.bind_param(stmt, 1, name, ibm_db.SQL_PARAM_INPUT)
ibm_db.bind_param(stmt, 2, second_name, ibm_db.SQL_PARAM_INPUT_OUTPUT)
ibm_db.bind_param(stmt, 3, weight, ibm_db.SQL_PARAM_OUTPUT) print "Values of bound parameters _before_ CALL:"
print " 1: %s 2: %s 3: %d\n" % (name, second_name, weight) if ibm_db.execute(stmt):
print "Values of bound parameters _after_ CALL:"
print " 1: %s 2: %s 3: %d\n" % (name, second_name, weight)

五、开启事务:适合大批量插入数据提升性能

import ibm_db

array = { ibm_db.SQL_ATTR_AUTOCOMMIT : ibm_db.SQL_AUTOCOMMIT_OFF }
conn = ibm_db.pconnect("dsn=SAMPLE", "user", "password", array)
sql = "DELETE FROM EMPLOYEE"
try:
stmt = ibm_db.exec_immediate(conn, sql)
except:
print "Transaction couldn't be completed."
ibm_db.rollback(conn)
else:
ibm_db.commit(conn)
print "Transaction complete."

六、错误处理:

第一种:

import ibm_db
try:
conn = ibm_db.connect("dsn=sample","user","password")
except:
print "no connection:", ibm_db.conn_errormsg()
else:
print "The connection was successful"

第二种:

import ibm_db
conn = ibm_db.connect( "dsn=sample", "user", "password")
sql = "DELETE FROM EMPLOYEE"
try:
stmt = ibm_db.exec_immediate(conn, sql)
except:
print "Transaction couldn't be completed:" , ibm_db.stmt_errormsg()
else:
print "Transaction complete."

七、查看元数据

注意:调用元数据函数消耗大量的空间。如果可能的话,考虑缓存调用的结果以便在后续调用中使用。

ibm_db.client_info() 返回包含数据库客户端信息的只读对象.
ibm_db.column_privileges() 返回一个结果集,列出表的column和其关联特权
ibm_db.columns() 返回一个结果集,列出表的column和其关联元数据
ibm_db.foreign_keys() 返回一个结果集,列出表的column和其关联元数据
ibm_db.primary_keys() 返回一个结果集,列出表的外键
ibm_db.procedure_columns() 返回一个结果集,列出一个或多个存储过程的参数
ibm_db.procedures() 返回一个结果集,列出数据库里注册了的的存储过程
ibm_db.server_info() 返回包含数据库服务器信息的只读对象.
ibm_db.special_columns() 返回一个结果集,列出 表的唯一行标识符列
ibm_db.statistics() 返回一个结果集,列出表的索引和统计信息
ibm_db.table_privileges() 返回一个结果集,列出数据库中的表和相关权限。
 
import ibm_db

conn = ibm_db.connect("dsn=sample", "user", "password")
client = ibm_db.client_info(conn) # DB客户端信息
if client:
print "DRIVER_NAME: string(%d) \"%s\"" % (len(client.DRIVER_NAME), client.DRIVER_NAME)
print "DRIVER_VER: string(%d) \"%s\"" % (len(client.DRIVER_VER), client.DRIVER_VER)
print "DATA_SOURCE_NAME: string(%d) \"%s\"" % (len(client.DATA_SOURCE_NAME), client.DATA_SOURCE_NAME)
print "DRIVER_ODBC_VER: string(%d) \"%s\"" % (len(client.DRIVER_ODBC_VER), client.DRIVER_ODBC_VER)
print "ODBC_VER: string(%d) \"%s\"" % (len(client.ODBC_VER), client.ODBC_VER)
print "ODBC_SQL_CONFORMANCE: string(%d) \"%s\"" % (len(client.ODBC_SQL_CONFORMANCE), client.ODBC_SQL_CONFORMANCE)
print "APPL_CODEPAGE: int(%s)" % client.APPL_CODEPAGE
print "CONN_CODEPAGE: int(%s)" % client.CONN_CODEPAGE
ibm_db.close(conn)
else:
print "Error." # DB服务器信息
server = ibm_db.server_info(conn) if server:
print "DBMS_NAME: string(%d) \"%s\"" % (len(server.DBMS_NAME), server.DBMS_NAME)
print "DBMS_VER: string(%d) \"%s\"" % (len(server.DBMS_VER), server.DBMS_VER)
print "DB_NAME: string(%d) \"%s\"" % (len(server.DB_NAME), server.DB_NAME)
ibm_db.close(conn)
else:
print "Error."

Python操作db2的更多相关文章

  1. python操作db2和mysql ,ibm_db

    我需要提取mysql和db2的数据进行对比,所以需要用python对其都进行操作. python对mysql进行操作应该没什么问题,就是安装drive后就可以了,在上一篇中有讲安装python-mys ...

  2. python操作DB2数据库

    #!/usr/bin/env python# -*- coding:utf-8 -*- ########################## excute python2.7.13# sudo pip ...

  3. MongoDB的安装与python操作MongoDB

    一.安装MongoDB 因为我个人使用的是windows,就只记录下windows下的安装 1.下载安装 就是官网,下载msi,选个路径安装 2.配置 看见别的地方说需要手动在bin同级目录创建dat ...

  4. python操作oracle数据库-查询

    python操作oracle数据库-查询 参照文档 http://www.oracle.com/technetwork/cn/articles/dsl/mastering-oracle-python- ...

  5. Python接口测试实战3(上)- Python操作数据库

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  6. Python学习笔记(五)之Python操作Redis、mysql、mongodb数据库

    操作数据库 一.数据库 数据库类型主要有关系型数据库和菲关系型数据库. 数据库:用来存储和管理数的仓库,数据库是通过依据“数据结构”将数据格式化,以记录->表->库的关系存储.因此数据查询 ...

  7. 数据备份 及 Python 操作 Mysql

    一 MySQL数据备份 #1. 物理备份: 直接复制数据库文件,适用于大型数据库环境.但不能恢复到异构系统中如Windows. #2. 逻辑备份: 备份的是建表.建库.插入等操作所执行SQL语句,适用 ...

  8. Python(九) Python 操作 MySQL 之 pysql 与 SQLAchemy

    本文针对 Python 操作 MySQL 主要使用的两种方式讲解: 原生模块 pymsql ORM框架 SQLAchemy 本章内容: pymsql 执行 sql 增\删\改\查 语句 pymsql ...

  9. Python 【第六章】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

随机推荐

  1. 今天俺要说一说简单工厂模式(Simple Factory)

    前言:简单工厂不能说是设计模式,它是一种变成习惯,因为它不是23种设计模式之一,但是它在实际开发中经常用到,而且也非常简单,可以说是工厂模式的一个引导. 大多程序员都是单身狗,为了弥补一下你们的心情, ...

  2. qt delete

        在写博文之前,先推荐一篇文章,我觉着挺不错,也是qt中delete相关:QT父子与QT对象delete     学习C++的童鞋都知道new和delete必须是同时出现的,否则就会导致内存泄露 ...

  3. Ocelot中使用Butterfly实践

    Ocelot(https://github.com/TomPallister/Ocelot)是一个用.net core实现的API网关,Butterfly(https://github.com/But ...

  4. 【朝花夕拾】Android性能篇之(三)Java内存回收

    在上一篇日志([朝花夕拾]Android性能篇之(二)Java内存分配)中有讲到,JVM内存由程序计数器.虚拟机栈.本地方法栈.GC堆,方法区五个部分组成.其中GC堆是一块多线程的共享区域,它存在的作 ...

  5. 为OPENCV添加freetype支持并显示中文字符(在mac上编译opencv及contrib库)

    在mac电脑上管理这些gnu的库一般都使用Homebrew,但总有一些你个性化的需要是官方的Homebrew配方无法满足的.比如在屏幕的输出中使用中文字符. 在OPENCV中输出UTF8字符集早已经有 ...

  6. SpringBoot完美配置阿里云的文件上传

    新建一个config类 AliyunOSS.java @Configuration @Data public class AliyunOSS { private OSSClient ossClient ...

  7. Spring Boot(十一)Redis集成从Docker安装到分布式Session共享

    一.简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API,Redis也是技术领域使用最为广泛的存储中间件,它是 ...

  8. 关于跨DB增量(增、改)同步两张表的数据小技巧

    有些场景下,需要隔离不同的DB,彼此DB之间不能互相访问,但实际的业务场景又需要从A DB访问B DB的情形,这时怎么办?我认为有如下常规的三种方案: 1.双方提供RESET API,需要访问不同DB ...

  9. 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!

    using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Caching; usi ...

  10. .Net Core 实践 - 使用log4net记录日志(3)— log4net向ElasticSearch写日志

    demo地址:https://github.com/PuzzledAlien/log4net_demo/tree/master/DotNetCoreConsole_V3 Windows 10 安装部署 ...