利用Python优雅地操作Oracle数据库
mhr18 2024-09-29 14:14 25 浏览 0 评论
需要源码可以直接联系
方案一:
直接套用脚本,需可以看懂一些脚本逻辑
改代码中 类名为 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脚本即实现数据库的增删改查操作
目录介绍:
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
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
相关推荐
- 一文带您了解数据库的行列之争:行式与列式存储的异同
-
数据库存储格式是数据库管理系统中一个至关重要的方面,它直接影响到数据的组织和检索效率。在数据库中,有两种主要的存储格式,即行式存储和列式存储。这两者采用截然不同的方法来组织和存储数据,各自具有一系列优...
- NL2SQL(三)开源项目怎么选:talk is cheap, show me the code!
-
老规矩,先看效果下面的demo来自试用的SuperSonic,将会在下面详细介绍:大模型时代Text-to-SQL特点随着基于LLM技术的发展,RAG/AIAgent/Fine...
- JDK25长期支持版九月降临:18项王炸功能全解析
-
Java要放大招啦!9月份推出的JDK25长期支持版已经锁定18个超能力,从稳定值到结构化并发,还有Linux系统下的"预知未来"性能分析!下面我用打游戏的术语给你们掰扯明白:1、飞...
- OceanBase 推出单机版 高度兼容MySQL和Oracle
-
【环球网科技综合报道】3月27日,独立数据库厂商OceanBase正式发布单机版产品。据悉,这一产品基于自主研发的单机分布式一体化架构设计,具备极简数据库架构和高度兼容性,为中小规模业务提供兼具性能与...
- 黄远邦:应对7月1日闰秒对Oracle数据库影响
-
由于今年7月1日全世界会多出一秒,这可能对时间敏感的IT系统造成较大影响。中亦科技数据库团队对此问题做了深入的研究,并对用户系统提出了相应的解决方法及建议。中亦科技数据库产品总监黄远邦认为,闰秒调整会...
- MySQL数据库密码忘记了,怎么办?(mysql 数据库密码)
-
#头条创作挑战赛#MySQL数据库密码忘记了且没有其他可以修改账号密码的账户时怎么办呢?登录MySQL,密码输入错误/*密码错误,报如下错误*/[root@TESTDB~]#mysql-u...
- Chinese AI Talent in Spotlight as Nvidia and Meta Escalate Talent War
-
OntherightisBanghuaZhu,ChiefResearchScientistatNVIDIATMTPOST--SiliconValley’stoptech...
- 用Cursor开启JAVA+AI生涯(javascirpt怎么开启)
-
Cursor是基于VSCode开发的一款编辑器,支持多种语言的开发编辑。与传统的开发工具相比,它有多种优势:与AI无缝集成,响应速度快,占用内存小。但很多同学在"起步"过程中遇到了...
- 毕业十年了,自从做了开发用了很多软件,但距离写开发工具还很远
-
办公系统类:办公软件Word、Excel、PowerPoint三大必备技能+腾讯/金山在线文档解压缩操作:7-zip/winrar文件文本处理:Notepad++(文本编辑器正则表达式超级好...
- 盘点Java中最没用的知识⑤:这3个老古董你还在代码里“考古”?
-
一、Stack类:“继承Vector”的历史bug,为何成了性能拖油瓶?你是不是在学Java集合时,老师说过“栈结构用Stack类”?是不是在老代码里见过"newStack<>(...
- Gemini 2.5 Pro 0506发布,编程最强大模型, 碾压 Claude3.7 sonnent
-
一、Gemini2.5Pro(I/Oedition)发布1、为何叫I/Oedition?谷歌史上最强编程模型Gemini2.5Pro(I/Oedition)发布,具体型号是Gemin...
- 如何让无聊变得有趣(附本人大量美图)
-
文/图:金冬成在这条长300公里的公路上,我已经来回往返了无数次。3小时车程,一个人,想想都是多么无聊的一件事。其实,人生道路上,类似这种无聊的事情有很多很多。无聊的事情、枯燥的工作,往往让我们容易失...
- Oracle 推出 Java 24,增强 AI 支持和后量子加密
-
导读:Oracle宣布正式发布Java24,该语言增加了几个新功能,例如StreamGatherersAPI和Class-FileAPI的可用性,以及专门为AI推理和量子安全设计...
- 公司ERP突然变慢?“索引重建”这颗“药”可不能随便吃!
-
各位老板、IT小哥、财务小姐姐,有没有遇到过公司ERP系统突然卡顿得像“老爷车”,点个按钮半天没反应,急得直跺脚?这时候,可能有人会跳出来说:“我知道,重建一下数据库索引就好了!”听起来像个“神操作”...
- 基于Java实现,支持在线发布API接口读取数据库,有哪些工具?
-
基于java实现,不需要编辑就能发布api接口的,有哪些工具、平台?还能一键发布、快速授权和开放提供给第三方请求调用接口的解决方案。架构方案设计:以下是一些基于Java实现的无需编辑或只需少量编辑...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 一文带您了解数据库的行列之争:行式与列式存储的异同
- NL2SQL(三)开源项目怎么选:talk is cheap, show me the code!
- JDK25长期支持版九月降临:18项王炸功能全解析
- OceanBase 推出单机版 高度兼容MySQL和Oracle
- 黄远邦:应对7月1日闰秒对Oracle数据库影响
- MySQL数据库密码忘记了,怎么办?(mysql 数据库密码)
- Chinese AI Talent in Spotlight as Nvidia and Meta Escalate Talent War
- 用Cursor开启JAVA+AI生涯(javascirpt怎么开启)
- 毕业十年了,自从做了开发用了很多软件,但距离写开发工具还很远
- 盘点Java中最没用的知识⑤:这3个老古董你还在代码里“考古”?
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle 空为0 (51)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)