通过Python接口wx_Oracle访问数据库

Oracle数据库是商业软件,封闭的东西,折腾是难免的。

即使有Python接口,也是依赖Oracle原生类库的。

目前比较流行的Python访问Oracle的接口是:cx Oracle

1、安装instantclient

地址参考之前的一篇文章:《Linux下配置OCI(Oracle调用接口)》

以我的10g为例子,需要下面两个文件:

sdk-10.2.0.5.0-linux-x64.zip  需要这之中的include头文件

basiclite-10.2.0.5.0-linux-x64.zip  需要这之中的.so文件

把上述文件提取下来放到同一个目录下比如/home/lhy/instantclient_10_2,只要文件,去掉子文件夹!

然后可能需要给做一个软链接!

最后,要把目录结构export到ORACLE_HOME指定的环境变量下。

还有一个环境变量确保不会中文乱码

ln -s ./libclntsh.so.10.1 ./libclntsh.so
export ORACLE_HOME=/home/lhy/instantclient_10_2
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME
#保证中文不会乱码!
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

2、安装cx Oracle

tar -xzvf cx_Oracle-5.1.1.tar.gz
cd cx_Oracle-5.1.1
python ./setup.py install

如果顺利的话,就可以编译并安装了。

3、测试py访问Oracle

如下测试基本的连接和关闭,如果没有报错,就说明成功了!

import cx_Oracle

conn = cx_Oracle.connect("User/Pass@IP:Port/SID")
conn.close()

4、基本操作

参考:http://www.orafaq.com/wiki/Python

Select

connection = cx_Oracle.connect("uid/pwd@database")
cursor = connection.cursor()
cursor.execute("SELECT COUNT(*) FROM User_Tables")
count = cursor.fetchall()[0][0]
cursor.close()
connection.close()

Insert

connection = cx_Oracle.connect("uid/pwd@database")
cursor = connection.cursor()
cursor.execute("INSERT INTO User_Tables(login,first_name,last_name,age,date_of_birth)
                VALUES (:login,:first,:last,:age,to_date(:dob,'YYYY-MM-DD HH24:MI:SS'))",
               {
                'login' : 'some_user_login',
                'first' : 'some_first_name',
                'last' : 'some_last_name',
                'age' : 42,
                'dob' : '1970-01-01 23:52:00',
               }
              )
count = cursor.fetchall()[0][0]
cursor.close()
connection.commit()
connection.close()

自己观察,不难发现和Python自带的For sqlite3的语法基本完全一样。

 

 

4 thoughts on “通过Python接口wx_Oracle访问数据库

  1. coder4li

    大虾,请问,用 cx_oracle 执行  delete 操作 如何知道删除了几条数据?知道的话告诉我一下,千万别说是执行前做个select 查询哦,谢谢了

    Reply
    1. coder4coder4 Post author

      猜测你说的是没有sudo权限?
      可以将python不安装在root下,安装在自己目录下就好了。

      Reply

Leave a Reply

Your email address will not be published.