python完整教程-python操作oracle完整教程

1. 连接对象

操作数据库之前,首先要建立数据库连接。有下面几个方法进行连接。

>>>import cx_Oracle

>>>db = cx_Oracle.connect("hr", "hrpwd", "localhost:1521/XE")

>>>db1 = cx_Oracle.connect("hr/hrpwd@localhost:1521/XE")

>>>dsn_tns = cx_Oracle.makedsn("localhost", 1521, "XE")

>>>print dsn_tns

>>>print db.version

10.2.0.1.0

>>> versioning = db.version.split(".")

>>> print versioning

["10", "2", "0", "1", "0"]

>>> if versioning[0]=="10":

... print "Running 10g"

... elif versioning[0]=="9":

... print "Running 9i"

...

Running 10g

>>> print db.dsn

localhost:1521/XE

2. cursor对象

使用数据库连接对象的cursor()方法,你可以定义任意数量的cursor对象,简单的程序可能使用一个cursor,并重复使用了,但大型项目会使用多个不同的cursor。

>>>cursor= db.cursor()

应用程序逻辑通常需要清楚的区分处理数据操作的每个阶段。这将帮助更好的理解性能瓶颈和代码优化。这些步骤有:

parse(optional)

无需调用该方法,因为执行阶段会自动先执行,用于检查sql语句是否正确,当有错误时,抛出DatabaseError异常及相应的错误信息。如:"’ORA-00900:invalid SQL statement.“。

Execute

cx_Oracle.Cursor.execute(

statement,[parameters], **keyword_parameters)

该方法能接收单个参数SQL,直接操作数据库,也可以通过绑定变量执行动态SQL,parames或keyworparameters可以是字典、序列或一组关键字参数。

cx_Oracle.Cursor.executemany(statement,parameters)

特别有用的批量插入,避免一次只能插入一条;

Fetch(optional)

仅用于查询,因为DDL和DCL语句没有返回结果。如果cursor没有执行查询,会抛出InterfaceError异常。

cx_Oracle.Cursor.fetchall()

获取所有结果集,返回元祖列表,如果没有有效行,返回空列表。

cx_Oracle.Cursor.fetchmany([rows_no])

从数据库中取下一个rows_no数据

cx_Oracle.Cursor.fetchone()

从数据库中取单个元祖,如果没有有效数据返回none。

3. 绑定变量

绑定变量查询可以提高效率,避免不必要的编译;参数可以是名称参数或位置参数,尽量使用名称绑定。

>>>named_params = {"dept_id":50, "sal":1000}

>>>query1 = cursor.execute("SELECT * FROM employees WHERE department_id=:dept_idAND salary>:sal", named_params)

>>> query2 = cursor.execute("SELECT * FROM employees WHERE department_id=:dept_idAND salary>:sal", dept_id=50, sal=1000)

Whenusing named bind variables you can check the currently assigned ones using thebindnames() method of the cursor:

>>> printcursor.bindnames()

["DEPT_ID", "SAL"]

4. 批量插入

大量插入插入操作,可以使用python的批量插入功能,无需多次单独调用insert,这样可以提升性能。参考后面示例代码。

5. 示例代码

"""Created on 2016年7月7日

@author: Tommy"""import cx_Oracleclass Oracle(object):"""oracle db operator"""def __init__(self,userName,password,host,instance):

self._conn= cx_Oracle.connect("%s/%s@%s/%s" %(userName,password,host,instance))

self.cursor=self._conn.cursor()

def queryTitle(self,sql,nameParams={}):if len(nameParams) > 0:

self.cursor.execute(sql,nameParams)else:

self.cursor.execute(sql)

colNames=[]for i in range(0,len(self.cursor.description)):

colNames.append(self.cursor.description[i][0])returncolNames

# query methods

def queryAll(self,sql):

self.cursor.execute(sql)returnself.cursor.fetchall()

def queryOne(self,sql):

self.cursor.execute(sql)returnself.cursor.fetchone()

def queryBy(self,sql,nameParams={}):if len(nameParams) > 0:

self.cursor.execute(sql,nameParams)else:

self.cursor.execute(sql)returnself.cursor.fetchall()

def insertBatch(self,sql,nameParams=[]):"""batch insert much rows one time,use location parameter"""self.cursor.prepare(sql)

self.cursor.executemany(None, nameParams)

self.commit()

def commit(self):

self._conn.commit()

def __del__(self):if hasattr(self,"cursor"):

self.cursor.close()if hasattr(self,"_conn"):

self._conn.close()

def test1():

# sql= """select user_name,user_real_name,to_char(create_date,"yyyy-mm-dd") create_date from sys_user where id = "10000""""sql= """select user_name,user_real_name,to_char(create_date,"yyyy-mm-dd") create_date from sys_user where id =: id"""oraDb= Oracle("test","java","192.168.0.192","orcl")

fields= oraDb.queryTitle(sql, {"id":"10000"})

print(fields)

print(oraDb.queryBy(sql, {"id":"10000"}))

def test2():

oraDb= Oracle("test","java","192.168.0.192","orcl")

cursor=oraDb.cursor

create_table= """CREATE TABLE python_modules (

module_name VARCHAR2(50) NOT NULL,

file_path VARCHAR2(300) NOT NULL

)""" fromsys import modules

cursor.execute(create_table)

M=[]for m_name, m_info inmodules.items():try:

M.append((m_name, m_info.__file__))

except AttributeError:

pass

sql= "INSERT INTO python_modules(module_name, file_path) VALUES (:1, :2)"oraDb.insertBatch(sql,M)

cursor.execute("SELECT COUNT(*) FROM python_modules")

print(cursor.fetchone())

print("insert batch ok.")

cursor.execute("DROP TABLE python_modules PURGE")

test2()

https://blog.csdn.net/neweastsun/article/details/51852304

自己的代码:实现了无条件查询、有条件查询,数据多条插入等

"""---------------------------------------

Author:Zjh

Date: 2019-09-23 15:51

---------------------------------------"""

importcx_Oraclefrom sys importmodules#连接Oracle数据库

classoracleOperation():defopenOracleConn(self):#xnj= """

#(DESCRIPTION =

#(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.27.4)(PORT = 1521))

#(CONNECT_DATA =

#(SERVER = DEDICATED)

#(SERVICE_NAME = orcl) )

#)

#"""

#建立Oracle远程连接

#highway=cx_Oracle.connect("api_work","apiwork@1234",xnj)

highway=cx_Oracle.connect("api_work","apiwork@1234","192.168.27.4:1521/orcl")#获取cursor指针

#cursor=highway.cursor()

returnhighwaydefselect(self,connection):

cursor=connection.cursor()#数据库操作

#1.查询

sql = "select * from Python_Oracle"result=cursor.execute(sql)print("type of result", type(result)) #获取使用cursor对象的execute的方法返回的对象的类型

print("result:", result) #获取使用cursor对象的execute的方法返回的对象

print("Number of rows returned: %d" %cursor.rowcount)

rows= cursor.fetchall() #得到所有数据集

print("rows:", rows) #fetchall()方法得到的到底是设么类型的对象

for i inrows:print("序号:", i[0])print("水果种类:", i[1])print("水果库存量:", i[2])

cursor.close()

connection.close()#1.插入操作

deffactorSelect (self,connection,param):

cursor=connection.cursor()#带参数的查询 ,例子如下:

#query1 = cursor.execute("SELECT * FROM employees WHERE department_id =:dept_id AND salary >: sal", named_params)

sql="select * from Python_Oracle where kinds =:kinds"query1= cursor.execute(sql,param) #特别的注意,具体 的条件查询的格式

row=cursor.fetchall()print(row)

cursor.close()

connection.close()pass

definsert(self,connection):

cursor=connection.cursor()

sql="insert into Python_Oracle (id,kinds,numbers) values (:id,:kinds,:numbers)"cursor.prepare(sql)#2,"西瓜","100kg"

xx=[{"id":6},{"kinds":"荔枝"},{"numbers":"100kg"}]#result=cursor.execute(None,{"id":6,"kinds":"荔枝","numbers":"100kg"})

#result=cursor.execute(None,xx)

result=cursor.execute(None,xx)print("Insert result:",result)

connection.commit()

cursor.close()

connection.close()pass

def insert2(self,connection,insertParam=[]):

cursor=connection.cursor()#M=[(11,"sa","sa"),]

sql="insert into Python_Oracle (id,kinds,numbers) values (:id,:kinds,:numbers)"

if(len(insertParam)==0):print("插入的数据行的参数不能为空!")else:

cursor.prepare(sql)

result=cursor.executemany(None,insertParam)print("Insert result:",result)#count=cursor.execute("SELECT COUNT(*) FROM python_modules")

#print("count of python_modules:",count)

connection.commit()

cursor.close()

connection.close()pass

definsert3(self,connection):

cursor=connection.cursor()

M=[]for m_name, m_info inmodules.items():try:

M.append((m_name, m_info.__file__))exceptAttributeError:pass

print("M",M)for item inM:print(item)

sql= "INSERT INTO python_modules(module_name, file_path) VALUES (:1, :2)"cursor.prepare(sql)

cursor.executemany(None, M)

connection.commit()

cursor.close()

connection.close()pass

#废弃方法。不能运行,但是不知道为什么!!!

deftest2(self,connection):

oraDb=connection

cursor=oraDb.cursor()

create_table= """CREATE TABLE python_modules1 (

module_name VARCHAR2(50) NOT NULL,

file_path VARCHAR2(300) NOT NULL

)"""cursor.execute(create_table)

M=[]for m_name, m_info inmodules.items():try:

M.append((m_name, m_info.__file__))exceptAttributeError:pass

print(M)

sql= "INSERT INTO python_modules1(module_name, file_path) VALUES (:1, :2)"cursor.prepare(sql)

cursor.executemany(None,M)

cursor.execute("SELECT COUNT(*) FROM python_modules")

connection.commit()pass

defDelete(self,conn):

cursor=conn.cursor()

sql="delete"

pass

if __name__=="__main__":

db=oracleOperation()

connection=db.openOracleConn()#能运行的无条件查询语句

db.select(connection)#能够运行的条件查询语句

kinds_param = {"kinds": "芒果"}#db.factorSelect(connection,kinds_param)

#自己的能够运行的insert语句

insertParam=[(5,"大象","1T"),(6,"蚂蚁","0.001g")]

db.insert2(connection,insertParam)#第一个成功的运行的python-Oracle insert 语句 这个是参考网上的例子

#db.insert3(connection)

#不能运行的网上的insert例子

#db.test2(connection)

参考链接:https://blog.csdn.net/neweastsun/article/details/51852304

你可能感兴趣的:(python完整教程-python操作oracle完整教程)