官方文档: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. 【3分钟就会系列】使用Ocelot+Consul搭建微服务吧!

    一.什么Ocelot? API网关是一个服务器,是系统的唯一入口.API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端实现和微服务应用程 ...

  2. JVM垃圾回收

    1.  概念理解 1.1.  并行(Parallel)与并发(Concurrent) 并行:指多个垃圾收集线程并行工作,但此时用户线程仍然处于等待状态 并发:指用户线程与垃圾收集线程同时执行 1.2. ...

  3. Spring Security构建Rest服务-1300-Spring Security OAuth开发APP认证框架之JWT实现单点登录

    基于JWT实现SSO 在淘宝( https://www.taobao.com )上点击登录,已经跳到了 https://login.taobao.com,这是又一个服务器.只要在淘宝登录了,就能直接访 ...

  4. Java基础19:Java集合框架梳理

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  5. java中用MessageFormat格式化json字符串用占位符时出现的问题can't parse argument number

    在MessageFormat.format方法中组装jason数据字符串:{code:"w1",des:"w2"},起止分别有左大括号和右大括号. 直接写的点位 ...

  6. ARP欺骗攻击

    一.ARP攻击概述 ARP攻击主要是存在于局域网中,通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞,攻击者只要持续不断的发出伪造的ARP响应包就能更改目标主机 ...

  7. 什么是平衡二叉树(AVL)

    前言 Wiki:在计算机科学中,AVL树是最早被发明的自平衡二叉查找树.在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度都 ...

  8. 第63章 ASP.NET Identity 支持 - Identity Server 4 中文文档(v1.0.0)

    提供了基于ASP.NET身份的实现,用于管理IdentityServer用户的身份数据库.此实现是IdentityServer中的扩展点,以便为用户加载身份数据以将声明发送到令牌. 这个支持的仓储位于 ...

  9. C#调用Windows(8/10)自带的虚拟键盘

    以下是调用代码: private const Int32 WM_SYSCOMMAND = 274; private const UInt32 SC_CLOSE = 61536; [DllImport( ...

  10. 常见MQTT服务器搭建[转载]

    简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,它比较适合于在低带宽.不可靠的网络的进行远程传感器和控制设备通 ...