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