连接oracle数据库查询与封装调用

连接oracle数据库查询与封装调用----结果集打印(结果对应字段名与表格形式)

  • 1、连接oracle
    • 1.1 安装 cx_Oracle
    • 1.2 连接oracle数据库
  • 2、打印数据库查询结果集
    • 2.1 值嵌入字段名
    • 2.2 结果集显示为列表
      • 2.2.1 安装pandas:
  • 3、数据库连接封装与调用
    • 3.1 数据库连接封装
    • 3.2 数据库调用

1、连接oracle

1.1 安装 cx_Oracle

(1)下载cx_Oracle:
需保证系统版本,python版本,oracle客户端的版本,cx_Oracle的版本的一致性。oracle客户端的版本,cx_Oracle的版本,要与Python版本和位数对应。
Python版本:Python3.4.3 32位;
cx_Oracle的版本:cx_Oracle-5.2-11g.win32-py3.4
oracle客户端的版本:instantclient-basic-win32-11.2.0.1.0;
这里还有三个注意点:
版本位数对应,都是32位;
cx_Oracle和python版本对应,都是3.4;
cx_Oracle和instantclient版本对应,都是11;
(2)查看Python版本:win+R——cmd——python
连接oracle数据库查询与封装调用_第1张图片
(3)安装cx_Oracle:pip install cx-Oracle
或者去官网下载安装:https://pypi.org/project/cx-Oracle/#files
(4)下载地址:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html
把下载的文件解压,复制oci.dll,oraocci11.dll,oraociei11.dll的3个DLL粘贴到你的python安装目录的Libs/site-packages文件夹下面。

1.2 连接oracle数据库

import cx_Oracle  #导入oracle数据库
class ReadDB:
    # 定义连接对象,类方法
    conn=None
     #指定数据库配置文件
    dsn = open(r'D:\PLSQL Developer\instantclient\instantclient_11_3\NETWORK\ADMIN\tnsnames.ora')
     # 获取连接对象方法封装
    def get_conn(self):
        if self.conn is None:
            self.conn = cx_Oracle.connect(user="登录名",
                                          password="密码password",
                                          dsn="ORACLE_40.31",
                                          encoding="UTF-8")
        return self.conn  # 返回连接对象

2、打印数据库查询结果集

2.1 值嵌入字段名

    def get_sql_one(self, sql,params):
        # 定义游标对象及数据变量
        sursor = None
        data = None
        try:
            # 获取游标对象
            sursor = self.get_cursor()
            # 调用执行方法
            sursor.execute(sql,params)
            # 获取结果
            data = sursor.fetchone()
            #-------输出结果加入字段名
            des=sursor.description # 获取表详情,字段名,长度,属性等
            t=",".join([item[0] for item in des])
            table_head = t.split(',')  # # 查询表列名 用,分割
            dict_result = dict(zip(table_head,data))  # 打包为元组的列表 再转换为字典
            list_result = []
            list_result.append(dict_result)  # 将字典添加到list_result中
            print( "查询结果如下:\n", list_result, end='\n')
        except Exception as e:
            print("get_sql_one error:", e)
        finally:
            # 关闭游标对象
            self.close_cursor(sursor)
            # 关闭连接对象
            self.close_conn()
            # 返回执行结果
            return list_result

在这里插入图片描述

2.2 结果集显示为列表

2.2.1 安装pandas:

pip install --upgrade --user --default-timeout=1500 pandas(python安装目录下)

import pandas
# ------------------------获取所有数据结果集-------------------------
    def get_sql_all(self, sql,params):
        # 定义游标对象及数据变量
        global table_head
        sursor = None
        data = None
        data_count = 0
        try:
            # 获取游标对象
            sursor = self.get_cursor()
            # 调用执行方法
            sursor.execute(sql,params)
            # 获取所有结果
            data = sursor.fetchall()
            #-----------------输出结果对应表字段
            for i in data:
                list_list = list(i)
                des = sursor.description  # 获取表详情,字段名,长度,属性等
                t = ",".join([item[0] for item in des])
                table_head = t.split(',')  # # 查询表列名 用,分割
                dict_result = dict(zip(table_head, list_list))  # 打包为元组的列表 再转换为字典
                list_result = []
                list_result.append(dict_result)  # 将字典添加到list_result中
                # --------表格形式输出
                pandas.set_option('display.max_columns', None)  # 最大显示的列数
                pandas.set_option('display.max_row', None)  # 最大显示的行数
                pandas.set_option('display.max_colwidth', 100)  # 每一列的最大显示宽度,当列中的数据超过指定长度时就会以省略号代替。而它的单位则是像素
                pandas.set_option('display.width', 5000)  # 控制,可以不换行
                #-------列名对齐(有中文字符)
                pandas.set_option('display.unicode.ambiguous_as_wide', True)
                pandas.set_option('display.unicode.east_asian_width', True)
                delist = pandas.DataFrame(list_result)  # 制作表格,key作为列索引
                # ---------判断字段长度(根据长度显示输出)
                h = list(list_list)
                if len(h) > 10:
                    #-----输出结果对应表字段
                    print("字段数:", len(h), ",第" + str(data_count + 1) + "条查询结果如下:\n", list_result, end='\n')
                    data_count += 1  #计算循环次数+1
                else:
                    #-----输出结果为表格形式
                    print("字段数:", len(h),"数据结果如下:\n", delist, end='\n')
                    break  #退出循环
        except Exception as e:
            print("get_sql_all error:", e)
        finally:
            # 关闭游标对象
            self.close_cursor(sursor)
            # 关闭连接对象
            self.close_conn()
            # 返回执行结果
            return data

在这里插入图片描述

3、数据库连接封装与调用

3.1 数据库连接封装

示例代码:read_oracle.py

import datetime
import os.path
import cx_Oracle  #导入oracle数据库
import pandas  #pip install --upgrade --user --default-timeout=1500 pandas(scripts)
from _DBconnent.frozen_dir import app_path  

class ReadDB:
    global log
    # 定义连接对象,类方法
    conn=None
    #dsn = open(r'D:\PLSQL Developer\PLSQL Developer\instantclient\instantclient_11_3\NETWORK\ADMIN\tnsnames.ora')
    path = app_path()
   #--------------冻结路径的程序代码(判断路径是否存在)-------------------
    if os.path.exists(path + r'\tnsnames.ora'):   #检测目录文件是否存在
        file = path + r'\tnsnames.ora'  # 冻结路径的程序代码
        print(datetime.datetime.now(),'导入Oracle目录:',file)
        print("日志目录:",path + r'\log.txt')
        log = open(path + r'\log.txt', 'a+')
        log.writelines(str(datetime.datetime.now()) + " 导入Oracle目录:" + file + '\n')
        dsn=open(file,'r')
    elif os.path.exists(path + r'\_DBconnent'):
        file = path + r'\_DBconnent\tnsnames.ora'  # 冻结路径的程序代码
        print(datetime.datetime.now(),'导入Oracle目录:', file)
        log = open(path + r'\log\log.txt', 'a+')
        log.writelines(str(datetime.datetime.now()) + " 导入Oracle目录:" + file + '\n')
        dsn = open(file, 'r')
    else:
        os.makedirs(path)
    # 获取连接对象方法封装
    def get_conn(self):
        if self.conn is None:
            self.conn = cx_Oracle.connect(user="登录名",
                                          password="密码",
                                          dsn="ORACLE_40.31",
                                          encoding="UTF-8")
        return self.conn  # 返回连接对象
    # 获取游标对象封装
    def get_cursor(self):
        return self.get_conn().cursor()
    # 关闭游标对象封装
    def close_cursor(self, cursor):
        if cursor:
            cursor.close()
    # 关闭游标对象封装
    def close_conn(self):
        if self.conn:
            self.conn.close()
            # 注意:关闭连接对象后,对象还存在内存中,需要手工设置为None
            self.conn = None
    # 主要执行方法->在外界调用次方法就可以完成数据相应操作:
    #------------------获取一条数据结果集------------------
    def get_sql_one(self, sql,params):
        # 定义游标对象及数据变量
        sursor = None
        data = None
        data_count=0
        try:
            # 获取游标对象
            sursor = self.get_cursor()
            # 调用执行方法
            sursor.execute(sql,params)
            # 获取结果
            data = sursor.fetchone()
            #-------输出结果加入字段名
            des=sursor.description # 获取表详情,字段名,长度,属性等
            t=",".join([item[0] for item in des])
            table_head = t.split(',')  # # 查询表列名 用,分割
            dict_result = dict(zip(table_head,data))  # 打包为元组的列表 再转换为字典
            list_result = []
            list_result.append(dict_result)  # 将字典添加到list_result中
            print( "查询结果如下:\n", list_result, end='\n')
        except Exception as e:
            print("get_sql_one error:", e)
        finally:
            # 关闭游标对象
            self.close_cursor(sursor)
            # 关闭连接对象
            self.close_conn()
            # 返回执行结果
            return list_result
    # -------------------获取 所有数据结果集-----------------
    def get_sql_all(self, sql):
        # 定义游标对象及数据变量
        sursor = None
        data = None
        data_count = 0
        try:
            # 获取游标对象
            sursor = self.get_cursor()
            # 调用执行方法
            sursor.execute(sql)
            # 获取所有结果
            data = sursor.fetchall()
            # -------获取字段名
            for i in data:
                list_list = list(i)
                des = sursor.description  # 获取表详情,字段名,长度,属性等
                t = ",".join([item[0] for item in des])
                table_head = t.split(',')  # # 查询表列名 用,分割
                dict_result = dict(zip(table_head, list_list))  # 打包为元组的列表 再转换为字典
                list_result = []
                list_result.append(dict_result)  # 将字典添加到list_result中
                # --------表格形式输出
                pandas.set_option('display.max_columns', None)  # 最大显示的列数
                pandas.set_option('display.max_row', None)  # 最大显示的行数
                pandas.set_option('display.max_colwidth', 199)  # 每一列的最大显示宽度,当列中的数据超过指定长度时就会以省略号代替。而它的单位则是像素
                pandas.set_option('display.width', None)  # 控制,可以不换行
                # 列名对齐(有中文字符)
                pandas.set_option('display.unicode.ambiguous_as_wide', True)
                pandas.set_option('display.unicode.east_asian_width', True)   #设置输出右对齐
                delist = pandas.DataFrame(list(data),columns=list(table_head),index=None)  # 制作表格,data为表值,columns为列索引,index为行索引(none为默认)
                #print("数据结果如下:\n", "-"*150,'\n', delist, end='\n')
                #display(delist)
                #print(delist.head(1))  # 返回前n行
                #print(delist.tail(1))  # 显示后n行
                #print(tabulate(list(data),headers=table_head,tablefmt='simple'))  #tablefmt是设置表格形式,fancy_grid
                # ---------判断字段长度(根据长度显示输出)
                h = list(list_list)
                if len(h) > 10:
                    print("字段数:",len(h),",第"+str(data_count+1)+"条查询结果如下:\n", list_result, end='\n')
                    data_count += 1
                else:
                    print("字段数:", len(h),"数据结果如下:\n", delist, end='\n')
                    break

        except Exception as e:
            print("get_sql_all error:", e)
        finally:
            # 关闭游标对象
            self.close_cursor(sursor)
            # 关闭连接对象
            self.close_conn()
            # 返回执行结果
            return list_result
    #------------------------------ 修改 删除 新增----------------------
    def update_sql(self, sql,params):
        # 定义游标对象及数据变量
        sursor = None
        data = None
        try:
            # 获取游标对象
            sursor = self.get_cursor()
             # 调用执行方法
            sursor.execute(sql,params)
            # 提交事务
            self.conn.commit()
            print("数据更新成功!")
        except Exception as e:
            # 事务回滚
            self.conn.rollback()
            print("get_update error:", e)
        finally:
            # 关闭游标对象
            self.close_cursor(sursor)
            # 关闭连接对象
            self.close_conn()
            # 返回执行结果
            return data

3.2 数据库调用

示例代码:text.py

from _DBconnent.read_oracle import ReadDB   #连接yst_manager数据库
sql="select t.agt_merc_id,t.agt_merc_nm,t.f_term_no,t.f_device_sn,t.merc_id,t.merc_nm,t.reg_flg,t.is_active,t.pledge_state," \
    "t.pledge_id,t.comp_cb_id,t.cashback_policy,t.comm_rule_id,t.cash_end_time,t.org_cash_end_time from " \
    "yst_manager.t_cipher_code t where t.agt_merc_id='8011121000003WY' and merc_id is null order by t.f_import_time desc"
ReadDB().get_sql_all(sql)  #调用执行

你可能感兴趣的:(Oracle,Python,oracle)