• python cx_Oracle模块的安装和使用


     
    $wget http://download.oracle.com/otn/linux/instantclient/10204/basic-10.2.0.4.0-linux-x86_64.zip

    3.安装配置

    复制代码
    $unzip instantclient-basic-linux.x64-10.2.0.4.0.zip
    $cd instantclient_10_2
    $cp * /usr/lib   #直接放到动态库搜索路径中,不需要额外的环境配置
    
    或
    $unzip instantclient-basic-linux.x64-10.2.0.4.0.zip
    $cp -rf instantclient_10_2 /opt/
    $vi /etc/profile
          export ORACLE_HOME=/opt/instantclient_10_2
        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME
    
    $source /etc/profile
    复制代码

    4.配置tnsnames.ora(可不用配置tns)

    注意tnsnames.ora其实并不存在,是要自己创建的(这个也很恶心,我一开始以为还要安装什么东东。。),我没有使用这种方式,有兴趣的可以google一下。

    5.下载安装cx_Oracle python模块

    $wget http://downloads.sourceforge.net/project/cx-oracle/5.1.2/cx_Oracle-5.1.2-10g-py26-1.x86_64.rpm
    $rpm -ivh cx_Oracle-5.1.2-10g-py26-1.x86_64.rpm
    $ls /usr/lib/python2.6/site-packages/cx_Oracle.so #有这个文件表示安装成功,根据python的位置,也可能在其他地方,自己找一下吧

    6.验证及问题解决

    $python
    >>import cx_Oracle

    若报错:import cx_Oracle gave ImportError: libclntsh.so.10.1: cannot open shared object file: No such file or directory

    表示没有找到instant client的动态库,check一下环境变量是否配置,是否生效,版本是否正确。

    若报错:ImportError: ./cx_Oracle.so: undefined symbol: PyUnicodeUCS4_Decode

    Google的信息:There is nothing wrong with Debian. Python supports two incompatible  modes of operation for Unicode, UCS2 (the default), and UCS4. Debian  uses the default, Redhat uses UCS4. You need to recompile the extension  for UCS-2 mode (i.e. using a Debian installation); this would fix the undefined symbol: PyUnicodeUCS4_Decode

    所以重新编译python

    $./configure --prefix=/usr/local/python2.6.5 --enable-shared -enable-unicode=ucs4
    $make;make install

    再次验证,终于正常import了。

    使用:

    1.基本连接–使用Oracle tns alias

    复制代码
    connection =cx_Oracle.connect("tp/tp@ocn_test")
    #查看tns alias命令
    cmd>tnsping ocn_test
    TNS Ping Utility forLinux: Version 9.2.0.8.0-Production on 27-SEP-201110:47:48
    Copyright (c) 1997, 2006, Oracle Corporation.  Allrights reserved.
    Used parameter files:
    /opt/……/sqlnet.ora
    Used TNSNAMES adapter to resolve the alias
    Attempting to contact (DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL =TCP)(HOST =10.20.36.19)(PORT =1520))) (CONNECT_DATA =(SID =ocntest)))
    OK (10msec)
    复制代码

    2.用户输入密码连接

    pwd =getpass.getpass()
    connection =cx_Oracle.connect("tp",pwd,"ocn_test")

    3.用户直接在Python命令中输入连接账号信息,格式如python script.py tp/tp@ocn_test

    connection =cx_Oracle.connect(sys.argv[1])

    4.使用Easy Connect语法,通过Drive连接数据库

    connection =cx_Oracle.connect('tp','tp','10.20.36.19:1521/ocntest')
    #or
    connection =cx_Oracle.connect('tp/tp@10.20.36.19:1521/ocntest')

    5.先使用DSN构成TNSNAME

    tns_name =cx_Oracle.makedsn('10.20.36.19','1521',' ocntest ')
    connection =cx_Oracle.connect('tp','tp',tns_name)

    6.登陆as SYSDBA

    connection =cx_Oracle.connect('tp/tp@ocn_test', mode=cx_Oracle.SYSDBA)
    #or as SYSOPER
    connection =cx_Oracle.connect('tp/tp@ocn_test', mode=cx_Oracle.SYSOPER)

    在Linux服务器执行Oracle操作时报了一个错误:

    TNS:listener does not currently know of service requested in connect descriptor

    解决方式:

    问题分析见http://ora-12514.ora-code.com/,一番折腾,最后使用第5种连接方式,瞬间解决此问题。

    import cx_Oracle 
    conn = cx_Oracle.connect('用户名/密码@tnsname里面配置数据库名') 
    cursor = conn.cursor() 
    cursor.execute("select to_char(sysdate,'yyyymmdd') from dual") 
    rs = cursor.fetchone()  
    print('result = %s'%rs)
    result = 1
    cursor.close()
    conn.close() 
  • 相关阅读:
    【Angular】笔记(2):从前端基本知识认识Angular
    【Angular】笔记(1):使用.NET Framework类比认识Angular
    【C#】笔记(2):哈希表
    【WinForm】杂记(6):C#之DataTable类(总结)
    【C#】笔记(1):科学计算
    【WinForm】杂记(5):C#导入Excel到DataTable
    【WinForm】杂记(4):C#编写和调用exe程序(带参数)
    从mixin到new和prototype:Javascript原型机制详解
    亲身体验函数的柯里化
    简单理解jsonp原理
  • 原文地址:https://www.cnblogs.com/linn/p/4683615.html
Copyright © 2020-2023  润新知