Python优雅地操作Oracle数据库

这篇具有很好参考价值的文章主要介绍了Python优雅地操作Oracle数据库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

方案一:
直接套用脚本,需可以看懂一些脚本逻辑

改代码中 类名为 OracleConnector,它可以同时连接多个 Oracle 数据库,并提供执行增删改查操作的方法。

import cx_Oracle

class OracleConnector:
    def __init__(self, databases):
        self.connections = {}
        for db in databases:
            conn = cx_Oracle.connect(
                user=db['username'],
                password=db['password'],
                dsn=db['dsn'],
                encoding=db.get('encoding', 'UTF-8')
            )
            self.connections[db['name']] = conn

    def execute_query(self, database_name, query, params=None):
        with self.connections[database_name].cursor() as cursor:
            cursor.execute(query, params)
            result = cursor.fetchall()
        return result
    
    def execute_non_query(self, database_name, query, params=None):
        with self.connections[database_name].cursor() as cursor:
            cursor.execute(query, params)
            self.connections[database_name].commit()
            return cursor.rowcount
        
    def execute_query_all(self, databases, query, params=None):
        results = {}
        for db in databases:
            database_name = db['name']
            results[database_name] = self.execute_query(database_name, query, params)
        return results
    
    def execute_non_query_all(self, databases, query, params=None):
        results = {}
        for db in databases:
            database_name = db['name']
            try:
                res = self.execute_non_query(database_name, query, params)
                results[database_name] = res
            except cx_Oracle.DatabaseError as e:
                print(f"Error occurred when running query on {database_name}: {e}")
                self.connections[database_name].rollback()
        return results

以下是代码解释:

import cx_Oracle:导入 cx_Oracle 库,用于与 Oracle 数据库进行连接和交互。

class OracleConnector::定义一个名为 OracleConnector 的类。

def __init__(self, databases)::类的初始化方法,接受一个包含多个数据库信息的列表作为参数。

self.connections = {}:初始化一个字典,用于存储数据库连接。

for db in databases::遍历数据库列表中的每个数据库信息。

conn = cx_Oracle.connect(...):根据数据库信息创建数据库连接对象。user=db['username']:连接数据库的用户名。password=db['password']:连接数据库的密码。dsn=db['dsn']:Oracle 数据库的 DSN(数据源名称)。encoding=db.get('encoding', 'UTF-8'):可选的编码方式,默认为 UTF-8。

self.connections[db['name']] = conn:将数据库连接对象添加到字典中,以数据库名称作为键。

def execute_query(self, database_name, query, params=None)::执行查询语句的方法。database_name:数据库名称。query:要执行的查询语句。params=None:可选的查询参数。

with self.connections[database_name].cursor() as cursor::获取游标对象,用于执行 SQL 语句。

cursor.execute(query, params):执行查询语句。

result = cursor.fetchall():获取查询结果集。

return result:返回查询结果。

def execute_non_query(self, database_name, query, params=None)::执行非查询语句的方法,比如插入、更新和删除操作。

database_name:数据库名称。

query:要执行的非查询语句。

params=None:可选的参数。

with self.connections[database_name].cursor() as cursor::获取游标对象,用于执行 SQL 语句。

cursor.execute(query, params):执行非查询语句,比如插入、更新和删除操作。

self.connections[database_name].commit():提交事务,将修改操作永久保存到数据库中。

return cursor.rowcount:返回受影响的行数,即执行非查询操作后所影响的行数。

def execute_query_all(self, databases, query, params=None)::在多个数据库上执行相同的查询语句,并返回结果。

databases:要执行查询的数据库列表。

query:要执行的查询语句。

params=None:可选的查询参数。

results = {}:初始化一个字典,用于存储查询结果。

for db in databases::遍历数据库列表中的每个数据库。

database_name = db['name']:获取数据库名称。

results[database_name] = self.execute_query(database_name, query, params):执行查询,并将结果存储到字典中。

return results:返回包含查询结果的字典。

def execute_non_query_all(self, databases, query, params=None)::在多个数据库上执行相同的非查询语句,并返回结果。

databases:要执行非查询操作的数据库列表。

query:要执行的非查询语句。

params=None:可选的参数。

results = {}:初始化一个字典,用于存储操作结果。

for db in databases::遍历数据库列表中的每个数据库。

database_name = db['name']:获取数据库名称。

try::捕获可能发生的异常。

res = self.execute_non_query(database_name, query, params):执行非查询操作。

results[database_name] = res:将操作结果存储到字典中。

except cx_Oracle.DatabaseError as e::捕获 Oracle 数据库相关的异常。

print(f"Error occurred when running query on {database_name}: {e}"):打印出错信息。

self.connections[database_name].rollback():执行回滚操作,撤销之前的操作。

return results:返回包含操作结果的字典。

这个封装类使得可以同时连接多个 Oracle 数据库,并在它们上执行增删改查操作。而在执行非查询操作时,如果遇到错误,将会进行回滚操作,保证数据的一致性。

方案二:直接调用封装脚本(写用例,执行脚本即可)
脚本实现封装后,只需要在Oracle.yaml文件中写用例即可,此后执行Oracle.py脚本即实现数据库的增删改查操作

目录介绍:
python oracledb,数据库,python,oracle

Oracle.yaml 编写基本数据库信息

Orcale:
  username: user
  password:  pwd
  ip: 127.0.0.1
  port: 1521
  sid: orcl

PublicConfig.py脚本: 配置读取信息,方便调用

import os
from Public_Utils.util_yaml import YamlReader

class YamlPath:
    def __init__(self):
        current = os.path.abspath(__file__)
        self.base_dir = os.path.dirname(os.path.dirname(current))
        self._config_path = self.base_dir + os.sep + "Public_Config\Public_yaml"

    def get_oracle_file(self):
        self._config_file = self._config_path + os.sep + "Oracle.yaml"
        return self._config_file

class ConfigYaml:
    def __init__(self):   #初始yaml读取配置文件
        self.oracle_config = YamlReader(YamlPath().get_oracle_file()).yaml_data()

    def get_oracle_yaml(self):
        return self.oracle_config['Orcale']

if __name__ == '__main__':
    pass

Oracle.py执行脚本

#  coding=utf-8
import cx_Oracle
import os
import json
from Public_Config.PublicConfig import ConfigYaml
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

class Oracle:

    def __init__(self):
        user = ConfigYaml().get_oracle_yaml()['username']
        pwd = ConfigYaml().get_oracle_yaml()['password']
        ip = ConfigYaml().get_oracle_yaml()['ip']
        port = ConfigYaml().get_oracle_yaml()['port']
        sid = ConfigYaml().get_oracle_yaml()['sid']
        self.connect = cx_Oracle.connect(str(user) + "/" + str(pwd) + "@" + str(ip) + ":" + str(port) + "/" + str(sid))
        # self.connect = cx_Oracle.connect(f'{user}/{pwd}@{ip}:{port}/{sid}')   # 这里的顺序是 用户名/密码@oracleserver的ip地址/数据库名字
        self.cursor = self.connect.cursor()   # 使用cursor()方法获取操作游标

    def GetData(self,sql):
        self.cursor.execute(sql)
        # 使用Rowfactory更改查询结果,更直观查看数据
        columns = [col[0] for col in self.cursor.description]
        self.cursor.rowfactory = lambda *args: dict(zip(columns, args))
        # fetchall()一次取完所有结果
        # fetchone()一次取一行结果
        data = self.cursor.fetchall()
        return data

    def select(self, sql):   #查询
        list = []
        self.cursor.execute(sql)            # 使用execute方法执行SQL语句
        result = self.cursor.fetchall()     # fetchall()一次取完所有结果,fetchone()一次取一行结果
        col_name = self.cursor.description
        for row in result:
            dict = {}
            for col in range(len(col_name)):
                key = col_name[col][0]
                value = row[col]
                dict[key] = value
            list.append(dict)
        js = json.dumps(list, ensure_ascii=False, indent=2, separators=(',', ':'))
        '''json.dumps() 是把python对象转换成json对象的一个过程,生成的是字符串
           json.dump() 是把python对象转换成json对象生成一个fp的文件流,和文件相关'''
        return js #将结果返回为一个字符串

    def selectlist(self,sql):
        list = []
        self.cursor.execute(sql)
        result = self.cursor.fetchall()
        col_name = self.cursor.description
        for row in result:
            dict = {}
            for col in range(len(col_name)):
                key = col_name[col][0]
                value = row[col]
                dict[key] = value
            list.append(dict)
        return list   #将结果以列表返回

    def disconnect(self):   #未连接
        self.cursor.close()
        self.connect.close()

    def insert(self, sql, list_param):   #插入
        try:
            self.cursor.executemany(sql, list_param)
            self.connect.commit()
            print("插入ok")
        except Exception as e:
            print(e)
        finally:
            self.disconnect()

    def update(self, sql):   #更新
        try:
            self.cursor.execute(sql)
            self.connect.commit()
        except Exception as e:
            print(e)
        finally:
            self.disconnect()

    def delete(self, sql):   #删除
        try:
            self.cursor.execute(sql)
            self.connect.commit()
            print("delete ok")
        except Exception as e:
            print(e)
        finally:
            self.disconnect()

if __name__ == '__main__':
    print(Oracle().select(sql="select * from cifaccount a where a.cif_account ='310400009590' "))
    pass

util_yaml.py文章来源地址https://www.toymoban.com/news/detail-771377.html

import os
import yaml

class YamlReader:
    #初始化,判断文件是否存在
    def __init__(self,yaml_file):
        if os.path.exists(yaml_file):
            self.yaml_file = yaml_file
        else:
            raise FileNotFoundError("yaml文件不存在")
        self._data = None
        self._data_all = None

    def yaml_data(self):  #yaml文件读取 --单个文档读取
        #第一次调用data,读取yaml文档,如果不是,直接返回之前保存的数据
        if not self._data:
            with open(self.yaml_file,'rb') as f:
                self._data = yaml.safe_load(f)
        return self._data

    def yaml_data_all(self):  #多个文档的读取
        if not self._data_all:
            with open(self.yaml_file,'rb') as f:
                self._data_all = yaml.safe_load_all(f)
        return self._data_all

到了这里,关于Python优雅地操作Oracle数据库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQLite实战系列——如何优雅地操作数据库?

    在上一篇《SQLite学习(一)SQLite介绍、历史和下载启动方式》 中,讲解了 SQLite的历史,和其下载安装的方式,在本篇博客将讲解 SQLite 中,对数据库的操作。 同学们将学习到: SQLite 创建数据库 SQLite 删除数据库/

    2024年02月03日
    浏览(45)
  • python操作数据库

    首先安装数据插件 数据库的插入

    2024年02月13日
    浏览(52)
  • Python——数据库操作

    目录 (1)安装Flask-SQLAlchemy (2)使用Flask-SQLAlchemy操作数据库 (3)连接数据库  •创建数据表 •增加数据 •查询数据  •更新数据 •删除数据 Flask-SQLAlchemy是Flask中用于操作关系型数据库的扩展包 ,该扩展包内部集成了SQLAlchemy,并简化了在Flask程序中使用SQLAlchemy操作数据

    2024年02月04日
    浏览(58)
  • Python --数据库操作

    目录 1, mysql 1-1, mysql驱动 1-2, 连接mysql 1-3, 执行sql语句 1-4, 数据表操作 1-4-1, 创建数据表 1-4-2, 查询数据表 1-4-3, 修改数据表 1-4-4, 删除数据表 1-5, 修改数据表内容 1-5-1, 插入数据 1-5-2, 查询数据 1-5-3, 获取结果集 1-5-4, 更新数据 1-5-5, 删除数据 1-6, 断开mys

    2024年02月11日
    浏览(43)
  • 【100天精通python】Day30:使用python操作数据库_数据库基础入门

     专栏导读  专栏订阅地址: https://blog.csdn.net/qq_35831906/category_12375510.html 1.1 什么是数据库?         数据库是一个结构化存储和组织数据的集合,它可以被有效地访问、管理和更新。数据库的目的是为了提供一种可靠的方式来存储和管理大量的数据,以便用户和应用程序

    2024年02月13日
    浏览(61)
  • Python之数据库操作(连接数据库,增删改查操作,易错点理解)

    文章目录 前言 一、Python之数据库操作 二、 pymysql 安装 三、pymysql 包引入  连接数据库 创建游标 执行sql数据 - 增删改查 要获取查询结果数据 关闭游标,关闭数据库连接 总结 记录:Python操作数据库的步骤,不容易理解的地方。 学习地址: python与各大数据库的连接: http:/

    2023年04月16日
    浏览(57)
  • Python 操作 MySQL 数据库

    Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。 Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: GadFly mSQL MySQL PostgreSQL Microsoft SQL Server 2000 Informix Interbase Oracle Sybase 你可以访问Python数据库接口及API查看详细的支

    2024年02月14日
    浏览(41)
  • Python——操作MySQL数据库

    😊学习永无止境,记得每天学习新的知识!! 在很多业务场景中,我们或多或少都要对数据库上的数据进行的一系列操作, 包括读取数据、写数据、更新或修改数据、删除数据 等。这些操作可以通过编写SQL语句来实现,也可以通过使用数据库管理系统提供的API接口来实现。

    2024年02月09日
    浏览(42)
  • Python操作PostgreSQL数据库

    个人简介 :一个从会计转行数据分析师的三旬老汉 擅长领域 :数据分析、数据仓库、大数据 博客内容 :平时会将自己工作中遇到的问题进行归纳总结,分享给各位小伙伴,意在帮助大家 少加班 、 不掉发 ,让我们相互学习,一起进步。 本文分享使用Python操作PostgreSQL数据

    2024年02月15日
    浏览(46)
  • Python基础之数据库操作

    一、安装第三方库PyMySQL 1、在PyCharm中通过 【File】-【setting】-【Python Interpreter】搜索 PyMySQL进行安装 2、通过PyCharm中的 Terminal 命令行 输入: pip install PyMySQL 注:通过pip安装,可能会提示需要更新pip,这时可执行:pip install --upgrade pip 进行更新pip 二、mysql数据库查询(SELECT) 1、

    2024年01月24日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包