81.python操作oracle遇到的坑

python操作oracle:

记住这个地址:https://www.oracle.com/database/technologies/oracle-database-software-downloads.html

windows:

1.安装
	pip install cx_Oracle
2.使用
	报错如下:
	Cannot locate a 64-bit Oracle Client library: "The specified module could not be found"
    原因:你是用的python是64位的Oracle可能是32位,需要通过中间的工具建立连接oracle instantClient(Oracle客户端)
    
    # windows解决方法:
    1.下载链接
    https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html
    2.随意放在一个目录下面,同时添加环境变量ORACLE_HOME 
    我下载的11.2版本的放在:E:soft-yumoracleinstantclient_11_2,具体看个人需求
    然后建立了一个ORACLE_HOME的环境变量将如下路径放进去E:soft-yumoracleinstantclient_11_2
    之后再E:soft-yumoracleinstantclient_11_2安装目录下面建一个tnsnames.ora 的文件配置内容如下
    	oral = 
          (DESCRIPTION = 
            (ADDRESS = (PROTOCOL = TCP)(HOST = 这是ip)(PORT = 端口)) 
            (CONNECT_DATA = 
              (SERVER = DEDICATED) 
              (SERVICE_NAME = 数据库名) 
            ) 
          )
    3.将E:soft-yumoracleinstantclient_11_2文件夹下的oci.dll, oraocci12.dll,oraociei12.dll 
拷贝到python.exe文件同级目录下(我使用的虚拟环境,所以放在C:UsersyztPycharmProjects	est_envvenvScripts)
目录下面,你记得是用哪个根据自己的python.exe可以执行文件判断,之后重启pycharm一切ok.

linux解决方法:

1.下载软件安装(下载需要注册oracle账户)
地址:https://www.oracle.com/database/technologies/instant-client/downloads.html
注意版本问题:同时注意python 的位数和oracle客户端以及数据库一致(比如64位的oracle需要的都是64位)

2.解压(解压好了之后就可以了)
cd /opt/  # 我放在了/opt目录
[root@localhost opt]# ls
instantclient_11_2      odbc_cli  instantclient-basic-linux.x64-11.2.0.4.0.zip     
v9.5fp9_linux390x64_odbc_cli.tar.gz

unzip instantclient-basic-linux.x64-11.2.0.4.0.zip   # 解压出来  instantclient_11_2

3.配置tnsnames.ora文件(反正都有我感觉就是配置一个连接)
mkdir -p network/admin
cd network/admin
新建tnsnames.ora文件  # 记得把我的()和里面的注释删掉,记住括号也删掉
 
orcl =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 主机IP(我配置的和连接的ip不一样但是不影响连接))(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl(这东西和奇葩感觉就是库))
    )
  )
    
4.vim /etc/pfofile(加上下面的)
# oracle客户端配置
export ORACLE_HOME=/opt/instantclient_11_2
export TNS_ADMIN=/opt/instantclient_11_2/network/admin  # 这里注意下tnsnames.ora文件在哪里配置那个目录,可以自定义
export LD_LIBRARY_PATH=$ORACLE_HOME  # 这个是python查找文件时用的
export PATH=$ORACLE_HOME:$PATH

# 上面写完退出wq
命令行执行:source /etc/profile   

5.我写了一个脚本,用来连接oracle数据库

[root@localhost opt]# cat test.py 
import cx_Oracle
class OracleOpera(object):

    def __init__(self, host, user, password, port="1521", database=""):
        self.host = host
        self.user = user
        self.password = password
        self.port = int(port)
        self.database = database
    def conn(self):
        conn_url = "%s:%s/%s" % (self.host, self.port, "orcl")
        self.conn = cx_Oracle.connect(self.user, self.password, conn_url)
        self.cur = self.conn.cursor()
        print("连接成功")
if __name__ == '__main__':
    mysql_obj = OracleOpera("10.XX.XX.XX", "xxxx", "xxxxxx", "1521")
    mysql_obj.conn()
    
6.连接测试
[root@localhost opt]# python3 test.py 
连接成功

完成了ok
7.关于tnsnames.ora文件补充,有兴趣可以看
	https://www.cnblogs.com/lixuwu/p/7127148.html
    # 看了就会懂下面的sql是干嘛的
    select INSTANCE_NAME from v$instance;  # 查看某个数据操作句柄(也就是ORCL就是sid_name)
    select name from V$database;  # 查看集群操作句柄(这个是操作所有数据库集群的服务名)
    # 举个例子在操作文件时fp = open(test.txt, "a")其中的fp就是句柄,拿到它你就可以操作text.txt文件,而
    第二个sql可以理解为打开多个文件,但是oracle数据使用了一种集群方式,将操作多个文件句柄合并到了一个上面
        
参考:https://www.cnblogs.com/hanjianfei/p/11453790.html

需要的安装包:
    链接:https://pan.baidu.com/s/1H0F48AG7J7MHwvwS-eM2zw 
    提取码:dfq0 

原文地址:https://www.cnblogs.com/liuzhanghao/p/13431580.html