转:https://www.cnblogs.com/cyxiaer/p/9396861.html

必需的Oracle链接库的下载地址:https://www.oracle.com/technetwork/topics/winx64soft-089540.html

只连接数据库的话不必安装客户端:

1. 把cx_Oracle的客户端文件复制到site-packages/ 目录下,可能是Python, Anaconda, venv下面的安装包里

2. 把下载的instantclient文件夹下的.dll文件全部复制到site-packages/ 目录下

3. 把instantclient文件解压后的地址添加到环境变量里面去。

4. 创建数据库连接.

创建数据库连接connect和关闭数据库连接close

创建数据库连接的三种方式:

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

import cx_Oracle

db=cx_Oracle.connect('username/password@host/orcl')

db.close()

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

import cx_Oracle

db=cx_Oracle.connect('username','password','host/orcl')

db.close()

方法三:配置监听并连接

import cx_Oracle

tns=cx_Oracle.makedsn('host',1521,'orcl')

db=cx_Oracle.connect('username','password',tns)

db.close()

cx_Oracle错误:Unable to acquire Oracle environment handle

错误表现:
cx_Oracle连接Oracle数据库的时候报错:
cx_Oracle.InterfaceError: Unable to acquire Oracle environment handle

解决办法:将instantclient目录下的所有*.dll文件拷贝到Python27\Lib\site-packages目录下,问题解决

SQLAlchemy Oracle 的中文问题

你需要设置 NLS_LANG 环境变量,否则你读取出来的中文可能是乱码,或者当 insert 的数据有中文时会导致 Unicode 编码错误。

你可以在 Python 代码中这么设置环境变量

# 设置编码,否则:
# 1. Oracle 查询出来的中文是乱码
# 2. 插入数据时有中文,会导致
# UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-7: ordinal not in range(128)
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
No module named cx_Oracle:
import cx_Oracle
ImportError: No module named cx_Oracle

如果安装的 python 64 位,需要把cx_Oracle文件复制到 /usr/lib64/python2.7/site-packages/ 目录下

cd /usr/lib/python2.7/site-packages/
cp cx_Oracle.so /usr/lib64/python2.7/site-packages/cx_Oracle.so
cp cx_Oracle-5.1.2-py2.7.egg-info /usr/lib64/python2.7/site-packages/cx_Oracle-5.1.2-py2.7.egg-info

UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position ... 问题解决办法

目标文件的编码是导致标题所指问题的罪魁祸首
f = open("out.html","w")

,在windows下面,新文件的默认编码是gbk,这样的话,python解释器会用gbk编码去解析我们的网络数据流txt,然而txt此时已经是decode过的unicode编码,这样的话就会导致解析不了,出现上述问题。 解决的办法就是,改变目标文件的编码:

f = open("out.html","w",encoding='utf-8')
问题解决。

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提取。

res = cur.fetchall()[0][0].read();

fetchall和fetchone返回的是元组,加上[][],可以直接取到值。

for result in cur:  #循环从游标获取每一行并输出该行。
    print result
写完游标可以去循环游标让它输出结果。
 

查询: 
需要外部参数:

>>> cur.prepare('select * from t_emp a where a.empid=:id')
>>> cur.execute(None,{'id':id})
<cx_Oracle.Cursor on <cx_Oracle.Connection to cs@192.168.1.226:1521/db_emp>>
>>> cur.fetchall()

不需要外部参数:

>>> cur.execute("select e.empid,e.empname from t_emp e")
<cx_Oracle.Cursor on <cx_Oracle.Connection to cs@192.168.102.219: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() #最后记得关闭游标和数据库连接

python -- 连接 orclae cx_Oracle的使用 二的更多相关文章

  1. python -- 连接 orclae cx_Oracle的使用

    # 如果报错参考的资料 https://blog.csdn.net/white_xuqin/article/details/82878860 场景再现: python-cx_oracle报错" ...

  2. python 连接oracle -- sqlalchemy及cx_Oracle的使用详解

    python连接oracle -- sqlalchemy import cx_Oracle as orcl import pandas as pd from sqlalchemy import cre ...

  3. python 连接 Oracle 乱码问题(cx_Oracle)

    用python连接Oracle是总是乱码,最后发现时oracle客户端的字符编码设置不对. 编写的python脚本中需要加入如下几句: import os os.environ['NLS_LANG'] ...

  4. Python 连接Oracle数据库

    连接:python操作oracle数据库  python——连接Oracle数据库 python模块:cx_Oracle, DBUtil 大概步骤: 1. 下载模块 cx_Oracle (注意版本) ...

  5. python 连接ORacle11g

    一,准备软件 (1)cx_Oracle (2)instantclient 注: (1)instantclient是Oracle客户端,plsql称为数据库第三方可视化工具,即便装了plsql也还是要装 ...

  6. python连接Oracle的方式以及过程中遇到的问题

    一.库连接步骤 1.下载cx_Oracle模块 下载步骤 工具 pycharm :File--->右键setting--->找到Project Interpreter  -----> ...

  7. Python连接Oracle问题

    Python连接Oracle问题 1.pip install cx_oracle 2.会出现乱码问题:     方法一:配置环境变量     export NLS_LANG="SIMPLIF ...

  8. 【python】python连接Oracle数据库

    python连接Oracle数据库 查看Oracle版本 select * from v$version 下载对应版本的InstantClient 下载网址 InstantClient 1.解压Ins ...

  9. Python全栈开发【基础二】

    Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...

随机推荐

  1. 进程池和线程池、协程、TCP单线程实现并发

    一.进程池和线程池 当被操作对象数目不大时,我们可以手动创建几个进程和线程,十几个几十个还好,但是如果有上百个上千个.手动操作麻烦而且电脑硬件跟不上,可以会崩溃,此时进程池.线程池的功效就能发挥了.我 ...

  2. 树莓派搭建python环境服务器

    树莓派搭建python环境服务器 服务器结构大致为:django+uwsgi+nginx+python+sqlite 配置python环境 系统本身自带了python2.7和python3.5.在这里 ...

  3. 已拦截跨源请求:同源策略禁止读取位于XXX的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin'

    vue+springboot项目 前端发送请求微信 URL:http:/.........(企业微信的路径) 请求成功,数据发送过去可以接收到,处理完毕后发送返回值给我 我这边前端网络响应处可以看到返 ...

  4. Hadoop2.x 集群搭建

    Hadoop2.x 集群搭建 一些重复的细节参考Hadoop1.X集群完全分布式模式环境部署 1 HADOOP 集群搭建 1.1 集群简介 HADOOP 集群具体来说包含两个集群:HDFS 集群和YA ...

  5. git安装用法和常用命令

    目录 git 下载 安装 git 工作中常用命令 Git常用命令汇总以及其它相关操作 或者 常出错误: 常用修改: 题外话(相关概念) git 下载 安装 1.下载Git,官网地址:https://g ...

  6. Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type())

    Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type()) 一丶类的结构细分    ...

  7. redux核心知识

    Provider 作用:把父组件传递进来的store对象放入react 上下文中,这样connect组件就可以从上下文中获取到store对象   Connect 作用: 1.从react上下文中取出s ...

  8. JavaScript学习笔记(6月份)

    由于笔记比较杂,本身学习程度并不理想,所以暂时没有整理这些繁杂的笔记. ps:博客园markdown用起来和看起来都舒服太多了,这才是我了解的那个markdown,又回来了! 笔记 DOM对象 doc ...

  9. 仿百度图片首页--HTML+CSS练手项目1【Table】

    [本文为原创,转载请注明出处] 技术[CSS+HTML]   布局[Table] 图片准备[百度图标.10张不同类型图] --------------------------------------- ...

  10. 编译 Unity 4.3.1 引擎源码

    引言 Unity 官方从 Unity 2017.1 版本开始,开源了引擎和编辑器的C#源码(源码地址:UnityCsReference),但核心的 C/C++ 部分源码并未开源. 编译环境 网上主要的 ...