• 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 
    
    
  • 相关阅读:
    剑指Offer-46.孩子们的游戏(圆圈中最后剩下的数)(C++/Java)
    剑指Offer-45.扑克牌顺子(C++/Java)
    剑指Offer-44.翻转单词顺序列(C++/Java)
    剑指Offer-43.左旋转字符串(C++/Java)
    剑指Offer-42.和为S的两个数字(C++/Java)
    剑指Offer-41.和为S的连续正数序列(C++/Java)
    剑指Offer-40.数组中只出现一次的数字(C++/Java)
    剑指Offer-39.把数组排成最小的数(C++/Java)
    Codeforces Round #316 (Div. 2) D Tree Requests
    URAL 1774 Barber of the Army of Mages (最大流)
  • 原文地址:https://www.cnblogs.com/liuzhanghao/p/13431580.html
Copyright © 2020-2023  润新知