13 python访问oracle

  1 一.  cx_Oracle
  2 
  3        Python 连接Oracle 数据库,需要使用cx_Oracle 包。
  4        该包的下载地址:http://cx-Oracle.sourceforge.net/
  5        下载的时候,注意版本,对不同版本的Oracle 和平台,都有不同的cx_Oracle。
  6  
  7 
  8 二.  Python 连Oracle 的基本操作
  9 
 10 2.1  DB连接和关闭DB连接
 11 
 12 2.1.1 方法一:用户名,密码和监听 分开写
 13       db=cx_Oracle.connect('system','oracle','192.168.2.42:1521/dave')
 14 2.1.2 方法二:用户名,密码和监听写在一起
 15       db=cx_Oracle.connect('system/oracle@192.168.2.42:1521/dave')
 16 2.1.3 方法三:用户,密码和连接串写在一起 
 17       dbh_zk=cx_Oracle.connect('zk/zk@ocsdb1')  ##当然前提是数据库安装路径下已经配置好了配置文件
 18 2.1.3 方法三:配置监听并连接
 19       tns=cx_Oracle.makedsn('rac1',1521,'dave1')    ##配置监听
 20       db=cx_Oracle.connect('system','oracle',tns)   ##连接数据库
 21  
 22     
 23 
 24 例:
 25      [root@rac1 u01]# cat db.py
 26           import cx_Oracle
 27           tns=cx_Oracle.makedsn('rac1',1521,'dave1')
 28           db=cx_Oracle.connect('system','oracle',tns)
 29           print tns
 30           print db.version
 31           vs=db.version.split('.')
 32           print vs
 33           if vs[0]=='10':
 34              print "This is Oracle 10g!"
 35           db.close()
 36      [root@rac1 u01]# python db.py
 37          (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=rac1)(PORT=1521)))(CONNECT_DATA=(SID=dave1)))   ##此即为创建的监听字符串
 38          10.2.0.1.0
 39          ['10', '2', '0', '1', '0']
 40          This is Oracle 10g!
 41      
 42 2.2  建立cursor 并执行SQL语句
 43      conn = cx_Oracle.connect('fkong/fkong@172.17.23.129/orcl')      ##连接数据库    相当于perl中的connect()
 44      cursor = conn.cursor ()                                         ##创建连接池    相当于perl中的prepare()
 45      cursor.execute ("select * from dual")                           ##执行SQL语句   相当于perl中的execute()
 46      row = cursor.fetchone ()                                        ##获取结果      相当于perl中的fetchrow()   (1,2,3) 
 47      row = cursor.fetchall()                                         ##获取所有行的列表 ,每行是列表中的一个元组[(1,2,3),(4,5,6),.....]
 48      print row[0][0]  
 49      conn.commit()                                                     ##将事务提交。  perl中执行后,都是自动提交的,
 50      cursor.close ()                                                 ##关闭连接池    相当于perl中的disconnect()  没有相当于PERL中的finish(),执行一个SQL后,可以接着执行另一个SQL
 51      conn.close ()                                                   ##关闭连接      相当于perl中的disconnect()
 52      
 53 
 54      ##获取的每行数据都是元组,(不可更改)
 55      fetchall()   ---生成所有结果到列表中,每条查询结果即为列表中的元素, 每个元素即是一个元组,(总的来说,相当于一个二维数组)
 56                   ---如:[(1, 13865999999L), (2, 13888888888L),......]
 57 
 58      fetchone()   ---一次返回一条查询结果,每行查询结果即是元组
 59                     (2, 13888888888L)
 60                     (2, 13888888888L)
 61           ---------------
 62           rs=cr.fetchall()  ####一次返回所有结果集
 63           for x in rs:
 64                   print x
 65           
 66           --------------
 67           while(1):
 68                   rs=cr.fetchone()  ####一次返回一行
 69                   if rs ==None:break
 70                   print rs
 71           
 72           ------------- 
 73 
 74    2.3--带参数的SQL查询
 75        
 76        pr={'id':3,'tel':13888888888}
 77        cr.execute('select * from phone where id=:id or phone=:tel',pr)   ##这里我们将参数作为一个字典来处理的
 78        cr.execute('select * from phone where id=:id or phone=:tel',id=3,tel=13888888888)   ###这里我们直接写参数
 79        rs=cr.fetchall()
 80        print rs
 81        -- 当只有一次参数的时候,也要把它写成元组的形式,比如
 82         Cursor.execute('select name from user where id=:1',(login_Id,))
 83 
 84       ------
 85  if :
 86  
 87        特别注意:!!!!!
 88             如果用第1种方式传递参数,即没有等于号 “=” 的方式传参,则只能有两个参数,而  ###第二个参数只能是字典即{},或序列即[]
 89             如果用“=” 等于号的方式传参,则可以有任意个参数,
 90 
 91        特别注意:
 92             ---记住 : ## '' 两个单引号中间,如果写占位符变量,则无法识别
 93                 所以:如果PYTHON有传递参数到SQL语句中,则SQL语句,最好不要使用PLSQL,因为PLSQL的动态SQL经常会用到''括起来,则PYTHON无法识别里面的占位符 
 94             ---记住:  ## 查询语句返回的是什么类型的字段,则python中变量接收后也是什么类型的
 95 
 96             ---记住:  ## sql语句是需要的变量是什么类型的,python传递过去时,类型要一致。
 97 
 98            要么只能以%号方式,事先拼好语句,
 99            要么就写存过,避免掉PYTHON传递参数到SQL语句中。
100 
101     2.4 调用存储过程:
102     -- 调用存储过程和方法
103     cursor.callproc('proc_name',[var1,var2])
104     ## 说明,即使存过只有一个参数,也要写成列表的形式
105 
106 
107 
108 #####数据库中的数据类型,SELECT查询出来后,和接收的元组的数据类型是一致的,
109          

原文地址:https://www.cnblogs.com/2mei/p/9254122.html