Python连接Oracle数据库

1. cx_Oracle

cx_Oracle模块是Python连接Oracle数据库的模块,在Python中,如果要连接Oracle,必须先安装cx_Oracle模块。
cx_Oracle的下载地址:https://pypi.python.org/pypi/cx_Oracle/
选择和操作系统、Python版本一致的安装包进行安装。当然为了省事儿,你也可以直接使用pip命令来安装cx_Oracle。

pip install cx_Oracle

安装完成后,在交互模式下输入import cx_Oracle,不报错,说明安装成功。

2. 连接Oracle数据库

方法一:用户名、密码、监听分开写

import cx_Oracle
db=cx_Oracle.connect('username','password','host:port/sid')

方法二:用户名、密码、监听写一起

import cx_Oracle 
db=cx_Oracle.connect('username/password@host:port/sid') 

方法三:先配置监听,后连接

import cx_Oracle 
tnsname = cx_Oracle.makedsn('host', port,'sid') 
db = cx_Oracle.connect('username','password',tnsname)   

说明:代码中username、password、host、port、sid换成实际数据库的用户名、密码、主机名或主机IP、数据库实例名。

3. 创建游标

cx_Oracle中,对于数据库的增删改查操作需要通过游标来进行,游标的创建语句如下:

cur=db.cursor()

4. 执行sql语句

Sql语句书写:不需要从外部传入参数,可以直接书写sql语句,然后使用execute执行sql即可;如果需要从外部传入参数,在需要传入参数的地方使用变量,并在变量前加“:”,然后通过prepare加载sql语句。

  • cur.prepare:如果执行的sql语句需要传外部参数,可以先用这个函数加载sql语句,然后再通过execute或executemany加参数执行。
  • cur.execute:执行单条sql语句。
  • cur.executemany:执行多条sql语句。

关于execute需要说明的是如果执行的sql语句不需要从外部传入参数,那么可以跳过prepare,直接将sql语句作为execute的第一个参数来执行sql。

  • db.commit():执行提交操作,增、删、改后需要使用。
  • cur.fetchall:在查询之后使用,获取所有查询到的结果记录。
  • cur.fetchone:在查询之后使用,获取一条查询到的结果记录。

关于fetchall和fetchone需要说明的是查询到的记录一旦被提取,就不能再次被提取,不管是用fetchall提取还是使用fetchone提取。

查询:
需要外部参数:

扫描二维码关注公众号,回复: 2799745 查看本文章
>>> cur.prepare('select * from t_emp a where a.empid=:id')
>>> cur.execute(None,{'id':id})
<cx_Oracle.Cursor on <cx_Oracle.Connection to [email protected]:1521/db_emp>>
>>> cur.fetchall()

不需要外部参数:

>>> cur.execute("select e.empid,e.empname from t_emp e")
<cx_Oracle.Cursor on <cx_Oracle.Connection to [email protected]:1521/t45>>
>>> cur.fetchone()
(1, '张三')
>>> cur.fetchall()
[(2, '李四'), (3, '王五'), (4, '沈六'), (5, '田七'), (6, '凤九')]

增加、删除、修改:

单条增加:

>>> sql="insert into t_emp(empid,empname) values (:empid,:empname)"
>>> cur.prepare(sql)
>>> cur.execute(None,{'empname':'李绅','empid':7})
>>> db.commit()

多条增加:

>>> sql="insert into t_emp(empid,empname) values (:empid,:empname)"
>>> cur.prepare(sql)
>>> cur.executemany(None,[{'empname':'赵青','empid':8},{'empname':'萧远','empid':9}])
>>> db.commit()

单条修改:

>>> sql="update t_emp a set a.empname='清月' where a.empid=:empid"
>>> cur.prepare(sql)
>>> cur.execute(None,{empid:"4"})
>>> db.commit()

多条修改:

>>> sql="update t_emp a set a.empname=:empnamewhere a.empid=:empid"
>>> cur.prepare(sql)
>>> cur.executemany(None,[{'empid':"5","empname":"明月"},{'empid':"6","empname":"乐天"}])
>>> db.commit()

删除:

>>> cur.execute('delete from t_emp a where a.empid in (3,4,5,6)')
>>> db.commit()

5. 关闭游标

sql语句执行结束,不再使用时,应关闭游标,关闭游标的语句为:

cur.close()

6. 关闭数据库

数据库操作结束后应及时释放连接,关闭数据库连接的语句为:

db.close()

7. 我写的一个Oracle数据库操作类

cx_Oracle是Python的Oracle操作的模块,在使用时导入就能使用,但是因为数据库使用时涉及连接、操作、提交、关闭连接等一系列操作,不可能每次使用时都把这些操作用代码写一遍,所以我把这些操作放到一个类里,在实际使用时来调用这个类就行了。

#coding=utf-8
import cx_Oracle
class OpOracle():
    def __init__(self,ora_username,ora_password,ora_host,ora_port,ora_sid):
        '''初始化Oracle连接'''
        self.db=cx_Oracle.connect(ora_username,ora_password,ora_host+':'+ora_port+'/'+ora_sid)
        self.cur=self.db.cursor()
    def Ora_Select(self,strSql):
        '''执行strSql语句进行查询'''
        self.cur.execute(strSql)
        return self.cur.fetchall()
    def Ora_IUD_Single(self,strSql):
        '''执行strSql语句进行增加、删除、修改操作'''
        self.cur.execute(strSql)
        self.db.commit()
    def Ora_IUD_Multi(self,strSql,List):
        '''执行strSql语句进行增加、删除、修改操作,对应参数使用List中的数据'''
        self.cur.prepare(strSql)
        self.cur.executemany(None,List)
        self.db.commit()
    def Ora_Cur_Close(self):
        '''关闭游标'''
        self.cur.close()
    def Ora_db_Close(self):
        '''关闭Oracle数据库连接'''
        self.db.close()

我把这段代码保存在OpOracle.py文件中,使用时直接导入这个文件即可。如:

from OpOracle import OpOracle
ora=OpOracle('cs','ceshi','192.168.1.226','1521','db_emp')
l_emp=ora.Ora_Select('select * from t_emp')    #查询t_emp表的数据并保存到l_emp列表中
ora.Ora_IUD_Single('delete from t_emp a where a.empid=1')  #删除empid为1的记录
ora.Ora_Cur_Close()
ora.Ora_db_Close()     #最后记得关闭游标和数据库连接

当然上面的例子比较简单,可能看不出太明显的效果,但是当在大型项目中使用时就会有不错的效果。

好了,就写到这里了,如果转帖,请注明出处。

猜你喜欢

转载自blog.csdn.net/xinyuzxx/article/details/81703625