zoukankan      html  css  js  c++  java
  • 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          
    
  • 相关阅读:
    0806 c#总复习
    0804 递归
    0808 html基础
    0803结构体,枚举类型
    0801out传值
    0731函数
    0730特殊集合
    0728多维数组,ArrayList集合
    js 获取url链接的任意参数
    jq dom操作
  • 原文地址:https://www.cnblogs.com/2mei/p/9254122.html
Copyright © 2011-2022 走看看