• python访问Oracle数据库相关操作


    环境:
    Python版本:3.6.6
    win系统:64位
    Linux系统:64位

    首先安装配置时,版本必须一致!包括:系统版本,python版本,oracle客户端的版本,cx_Oracle的版本!

    需要的安装包:

    Oracle Instant Client 客户端下载
    https://www.oracle.com/cn/database/technologies/instant-client/downloads.html
    instantclient-basic-windows.x64-11.2.0.4.0.zip

    cx_Oracle 下载
    https://pypi.python.org/pypi/cx_Oracle/6.0rc1
    https://sourceforge.net/projects/cx-oracle/files/
    cx_Oracle-6.0rc1-cp36-cp36m-manylinux1_x86_64.whl # linux
    cx_Oracle-6.0rc1-cp36-cp36m-win_amd64.whl # PIP 安装

    Windows 安装步骤:

    1. 解压 [instantclient ]客户端到指定目录,并新建环境变量:例如: ORACLE_HOME == D:apporacleproductinstantclient_11_2
      (设置好后cx_oracle会通过此路径找到它要的oci.dll等动态链接库)

    或者手动将文件复制过去:
    将解压文件夹下的oci.dll, oraocci12.dll,oraociei12.dll 拷贝到python安装目录下的lib/site-packages中

    1. 安装 cx_Oracle ;
    2. 验证安装是否成功: import cx_Oracle 或 python -c "import cx_Oracle"

    Linux 安装步骤:

    1. 解压 [instantclient-basic-windows.x64-11.2.0.4.0.zip] 到指定目录;
    2. 解压后的 [instantclient_11_2]目录。添加到 PATH环境变量中(如下);
    $ vim /etc/profile #文件尾部添加 
    export ORACLE_HOME=/opt/instantclient_11_2/
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME
    $ source /etc/profile    使文件修改生效 
    

    $ vim ~/.bash_profile 
    export ORACLE_HOME=/usr/lib/oracle/12.2/client64
    export LD_LIBRARY_PATH=/usr/lib/oracle/12.2/client64/lib
    $ source .bash_profile    使文件修改生效
    
    1. 创建软连接
      cd /安装目录/instantclient_11_2/ ln -s libclntsh.so.11.1 libclntsh.so

    2. 安装cx_Oracle:
      pip install cx_Oracle-6.0rc1-cp36-cp36m-win_amd64.whl

    3. 验证安装是否成功:
      import cx_Oracle 或 python -c "import cx_Oracle"

    注意:
    1、Oracle数据库服务器端和Python编码方式不一致时会导致读取的中文文本乱码,可以通过设置NLS_LANG环境变量解决这一问题。
    2、cx_Oracle模块会读取系统的path环境变量,寻找所需Oracle客户端文件,将path指向新下载的64位即时客户端,这样就可以解决系统中已有的Oracle11g - 32位版客户端与64位Python不兼容的冲突问题。
    环境变量设置: 解决查询汉字出现乱码的问题

    import os
    os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
    os.environ['path'] = 'C:/instantclient_11_2/'  # 解压的目录路径
    

    连接Oracle数据库

    • 连接数据库:
    import cx_Oracle
    # 方式一:
    tns = cx_Oracle.makedsn(locahost, port, database)
    db = cx_Oracle.connect(user, pwd, tns)
    # 方式二:
    db = cx_Oracle.connect('username','password','locahost/database')
    # 方式三:
    db = cx_Oracle.connect('用户名/密码@IP:端口号/database')
    
    • 创建操作游标:
    cursor = db.cursor()   # 用于进行 SQL 操作
    
    • 关闭数据库:
    cursor.close()  # 关闭游标
    db.close()  # 关闭数据库
    
    • SQL 查询:
    方式一:
    cursor.execute("Select member_id from member")
    
    方式二:
    sqlstr = "Select member_id from member where dt =:1 and id =:2"
    datatuplp = ('2021-02-08', '123456789')
    cursor.execute(sqlstr, datatuplp)
    
    方式三:
    cursor.prepare("""select * from tb_user where id <= :id""")
    cursor.execute(None,{'id':5})
    for row in cursor:  #相当于fetchall()
        print(row)
    
    • 获取查询结果:
    cursor.fetchall()    # 获取所有的结果
    cursor.fetchone()    # 获取一条结果
    
    • 创建表格:
    sql = 'create table tb_user(id number, name varchar2(50),password varchar(50),primary key(id))'
    cursor.execute(sql)
    
    • 插入数据:
    #插入一条记录
    cursor.execute("""insert into tb_user values(1,'admin','password')""")
    
    #再插入一条数据
    param={'id':2,'n':'admin','p':'password'}
    cursor.execute('insert into tb_user values(:id,:n,:p)',param)
    
    #一次插入多条数据,参数为字典列表形式
    param=[{'id':3,'n':'admin','p':'password'},{'id':4,'n':'admin','p':'password'},{'id':5,'n':'admin','p':'password'}]
    cursor.executemany('insert into tb_user values(:id,:n,:p)',param)
    
    #再一次插入多条数据
    param=[];
    #生成5条插入数据,参数为元组列表形式
    for i in range(6,11):   # [6,7,8,9,10]
        param.append((i,'user'+str(i),'password'+str(i)))
    #插入数据
    cursor.executemany('insert into tb_user values(:1,:2,:3)',param)
    
  • 相关阅读:
    ADO中的多层次数据集,类似于dataset
    工作流的设计
    Socket bind系统调用简要分析
    linux Network Address Translation NAT 转载 还需要整理
    生活20190602
    磁盘空间满的问题
    linux netfilter nat 实现 转载
    Socket 套接字的系统调用
    linux 网络编程 基础
    学习linux,不要找别人了,我有东西要发
  • 原文地址:https://www.cnblogs.com/hoyun/p/14389138.html
Copyright © 2020-2023  润新知