Python操作数据库类 Oracle、Sqlserver、PostgreSQL
我在工作中经常使用Python,特点很明显,轻量,效率还不错,尤其在维护或者自动化方面。
下面是我使用到的访问数据库(Oracle、Sqlserver、PostgreSQL)的公共类。
一、Oracl访问类
import cx_Oracle class DBOrc:
# Oracle 连接工具
SHOW_SQL = True def __init__(self, host, port, user, password, sid):
self.host = host
self.port = port
self.user = user
self.password = password
self.sid = sid
self._conn = None
self .__GetConnect() def __GetConnect(self):
if not self._conn:
dsn_tns = cx_Oracle.makedsn(self.host, self.port, self.sid)
dsn_tns = dsn_tns.replace('SID', 'SERVICE_NAME')
self._conn = cx_Oracle.connect(self.user, self.password, dsn_tns)
else:
pass def __del__(self):
if self._conn:
self._conn.close()
self._conn = None def _NewCursor(self):
cur = self._conn.cursor()
if cur:
return cur
else:
print("#Error# Get New Cursor Failed.")
return None def _DelCursor(self, cur):
if cur:
cur.close() # 检查是否允许执行的sql语句
def _PermitedUpdateSql(self, sql):
rt = True
lrsql = sql
sql_elems = lrsql.strip().split()
sql_elems2 = [x.upper() for x in sql_elems]
# update和delete最少有四个单词项
if len(sql_elems2) < 4:
rt = False
# 更新删除语句,判断首单词,不带where语句的sql不予执行
elif ('UPDATE' in sql_elems2 or 'DELETE' in sql_elems2):
if 'WHERE' not in sql_elems2:
rt = False
return rt def _commit(self):
self._conn.commit() def _rollback(self):
self._conn.rollback() # 检查是否允许执行的sql语句
def CheckSelectSql(self, sql):
rt = True
lrsql = sql
sql_elems = lrsql.strip().split()
sql_elems2 = [x.upper() for x in sql_elems]
# update和delete最少有四个单词项
if len(sql_elems2) < 4:
rt = False
# 更新删除语句,判断首单词,不带where语句的sql不予执行
elif ('UPDATE' in sql_elems2 or 'DELETE' in sql_elems2 or 'INSERT' in sql_elems2):
rt = False
return rt # 查询
def Query(self, sql, nStart=0, nNum=- 1):
rt = []
# 获取cursor
cur = self._NewCursor()
if not cur:
return rt
# 查询到列表
print(sql)
cur.execute(sql)
if (nStart == 0) and (nNum == 1):
rt.append(cur.fetchone())
else:
rs = cur. fetchall()
if nNum == - 1:
rt.extend(rs[nStart:])
else:
rt.extend(rs[nStart:nStart + nNum])
# 释放cursor
self._DelCursor(cur)
return rt # 更新
def Exec(self, sql):
# 获取cursor
rt = None
cur = self._NewCursor()
if not cur:
return rt
# 判断sql是否允许其执行
if not self._PermitedUpdateSql(sql):
return rt
# 执行语句
print(sql)
try:
rt = cur.execute(sql)
self._commit()
# 释放cursor
self._DelCursor(cur)
# return rt
return "success"
except Exception as e:
print(e)
self._conn.rollback()
return str(e) # 更新list
def Execlist(self, sqls):
# 获取cursor
rt = None
cur = self._NewCursor()
if not cur:
return rt
try:
for i in sqls:
# 判断sql是否允许其执行
if len(i.strip()) < 1:
continue
if not self._PermitedUpdateSql(i):
self._rollback()
return rt
# 执行语句
print(i)
rt = cur.execute(i)
self._commit()
# 释放cursor
self._DelCursor(cur)
# return rt
return "success"
except Exception as e:
print(e)
self._conn.rollback()
return str(e) # 导出结果为文件
def Export(self, sql, file_name, colfg='||'):
rt = self. Query(sql)
if rt:
with open(file_name, 'a') as fd:
for row in rt:
ln_info = ''
for col in row:
ln_info += str(col) + colfg
ln_info += '\n'
fd .write(ln_info)
oracle版本使用方法:
# 查询单个sql
orc = DBOrc(host, port, db, user, password)
sql = "select c1,c2,c3 from table1"
orc.Query(sql ) # 更新单个sql
sql = "update table1 set c1=0"
orc.Exec(sql ) # 更新多条sql
sqllist = []
sqllist.append("update table1 set c1=0")
sqllist.append("update table1 set c2=0")
orc.Execlist(sqllist)
二、Sqlserver访问类
import pymssql
from pymssql import _mssql
from pymssql import _pymssql class DBMSS:
# MSS 连接工具
def __init__(self, host, port, user, password, db):
self.host = host+":"+port
self.user = user
self.password = password
self.db = db
self._conn = None
self .__GetConnect() def __GetConnect(self):
if not self._conn:
self._conn = pymssql.connect(host=self.host, user=self.user, password=self.password, database=self.db, charset="utf8")
else:
pass def __del__(self):
if self._conn:
self._conn.close()
self._conn = None def _NewCursor(self):
cur = self._conn.cursor()
if cur:
return cur
else:
print("#Error# Get New Cursor Failed.")
return None def _DelCursor(self, cur):
if cur:
cur.close() # 检查是否允许执行的sql语句
def _PermitedUpdateSql(self, sql):
rt = True
lrsql = sql
sql_elems = lrsql.strip().split()
sql_elems2 = [x.upper() for x in sql_elems]
# update和delete最少有四个单词项
if len(sql_elems2) < 4:
rt = False
# 更新删除语句,判断首单词,不带where语句的sql不予执行
elif ('UPDATE' in sql_elems2 or 'DELETE' in sql_elems2):
if 'WHERE' not in sql_elems2:
rt = False
return rt def _commit(self):
self._conn.commit() def _rollback(self):
self._conn.rollback() # 检查是否允许执行的sql语句
def CheckSelectSql(self, sql):
rt = True
lrsql = sql
sql_elems = lrsql.strip().split()
sql_elems2 = [x.upper() for x in sql_elems]
# update和delete最少有四个单词项
if len(sql_elems2) < 4:
rt = False
# 更新删除语句,判断首单词,不带where语句的sql不予执行
elif ('UPDATE' in sql_elems2 or 'DELETE' in sql_elems2 or 'INSERT' in sql_elems2):
rt = False
return rt # 查询
def Query(self, sql, nStart=0, nNum=- 1):
rt = []
# 获取cursor
cur = self._NewCursor()
if not cur:
return rt
# 查询到列表
print(sql)
cur.execute(sql)
if (nStart == 0) and (nNum == 1):
rt.append(cur.fetchone())
else:
rs = cur. fetchall()
if nNum == - 1:
rt.extend(rs[nStart:])
else:
rt.extend(rs[nStart:nStart + nNum])
# 释放cursor
self._DelCursor(cur)
return rt # 更新
def Exec(self, sql):
# 获取cursor
rt = None
cur = self._NewCursor()
if not cur:
return rt
# 判断sql是否允许其执行
if not self._PermitedUpdateSql(sql):
return rt
# 执行语句
print(sql)
try:
rt = cur.execute(sql)
self._commit()
# 释放cursor
self._DelCursor(cur)
# return rt
return "success"
except Exception as e:
print(e)
self._conn.rollback()
return str(e) # 更新list
def Execlist(self, sqls):
# 获取cursor
rt = None
cur = self._NewCursor()
if not cur:
return rt
try:
for i in sqls:
# 判断sql是否允许其执行
if len(i.strip()) < 1:
continue
if not self._PermitedUpdateSql(i):
self._rollback()
return rt
# 执行语句
print(i)
rt = cur.execute(i)
self._commit()
# 释放cursor
self._DelCursor(cur)
# return rt
return "success"
except Exception as e:
print(e)
self._conn.rollback()
return str(e) # 导出结果为文件
def Export(self, sql, file_name, colfg='||'):
rt = self. Query(sql)
if rt:
with open(file_name, 'a') as fd:
for row in rt:
ln_info = ''
for col in row:
ln_info += str(col) + colfg
ln_info += '\n'
fd .write(ln_info)
SqlServer版使用方法:
# 查询单个sql
mss = DBMSS(host, port, db, user, password)
sql = "select c1,c2,c3 from table1"
mss.Query(sql ) # 更新单个sql
sql = "update table1 set c1=0"
mss.Exec(sql ) # 更新多条sql
sqllist = []
sqllist.append("update table1 set c1=0")
sqllist.append("update table1 set c2=0")
mss.Execlist(sqllist)
三、PostgreSQL访问类
import psycopg2 class DBPg:
# PG 连接工具
def __init__(self, host, port, db, user, password):
self.host = host
self.port = port
self.db = db
self.user = user
self.password = password
self._conn = None
self._conn = self.__GetConnect() def try_except(self):
def wrapper(*args, **kwargs):
try:
self(*args, **kwargs)
except Exception as e:
print("get error: %s" % e)
return wrapper # @try_except
def __GetConnect(self):
if not self._conn:
return psycopg2.connect(database=self.db, user=self.user, password=self.password, host=self.host, port=self.port)
else:
pass def __del__(self):
if self._conn:
self._conn.close()
self._conn = None def _NewCursor(self):
cur = self._conn.cursor()
if cur:
return cur
else:
print("#Error# Get New Cursor Failed.")
return None def _DelCursor(self, cur):
if cur:
cur.close() # 检查是否允许执行的sql语句
def _PermitedUpdateSql(self, sql):
rt = True
lrsql = sql
sql_elems = lrsql.strip().split()
sql_elems2 = [x.upper() for x in sql_elems]
# update和delete最少有四个单词项
if len(sql_elems2) < 4:
rt = False
# 更新删除语句,判断首单词,不带where语句的sql不予执行
elif ('UPDATE' in sql_elems2 or 'DELETE' in sql_elems2):
if 'WHERE' not in sql_elems2:
rt = False
return rt def _commit(self):
self._conn.commit() def _rollback(self):
self._conn.rollback() # 检查是否允许执行的sql语句
def CheckSelectSql(self, sql):
rt = True
lrsql = sql
sql_elems = lrsql.strip().split()
sql_elems2 = [x.upper() for x in sql_elems]
# update和delete最少有四个单词项
if len(sql_elems2) < 4:
rt = False
# 更新删除语句,判断首单词,不带where语句的sql不予执行
elif ('UPDATE' in sql_elems2 or 'DELETE' in sql_elems2 or 'INSERT' in sql_elems2):
rt = False
return rt # 查询
def Query(self, sql, nStart=0, nNum=- 1):
rt = []
# 获取cursor
cur = self._NewCursor()
if not cur:
return rt
# 查询到列表
print(sql)
cur.execute(sql)
if (nStart == 0) and (nNum == 1):
rt.append(cur.fetchone())
else:
rs = cur. fetchall()
if nNum == - 1:
rt.extend(rs[nStart:])
else:
rt.extend(rs[nStart:nStart + nNum])
# 释放cursor
self._DelCursor(cur)
return rt # 更新
def Exec(self, sql):
# 获取cursor
rt = None
cur = self._NewCursor()
if not cur:
return rt
# 判断sql是否允许其执行
if not self._PermitedUpdateSql(sql):
return rt
# 执行语句
print(sql)
try:
rt = cur.execute(sql)
self._commit()
# 释放cursor
self._DelCursor(cur)
# return rt
return "success"
except Exception as e:
print(e)
self._conn.rollback()
return str(e) # 更新list
def Execlist(self, sqls):
# 获取cursor
rt = None
cur = self._NewCursor()
if not cur:
return rt
try:
for i in sqls:
# 判断sql是否允许其执行
if len(i.strip()) < 1:
continue
if not self._PermitedUpdateSql(i):
self._rollback()
return rt
# 执行语句
print(i)
rt = cur.execute(i)
self._commit()
# 释放cursor
self._DelCursor(cur)
# return rt
return "success"
except Exception as e:
print(e)
self._conn.rollback()
return str(e) # 导出结果为文件
def Export(self, sql, file_name, colfg='||'):
rt = self. Query(sql)
if rt:
with open(file_name, 'a') as fd:
for row in rt:
ln_info = ''
for col in row:
ln_info += str(col) + colfg
ln_info += '\n'
fd .write(ln_info)
PG版本使用方法:
# 查询单个sql
pg = DBPg(host, port, db, user, password)
sql = "select c1,c2,c3 from table1"
pg.Query(sql ) # 更新单个sql
sql = "update table1 set c1=0"
pg.Exec(sql ) # 更新多条sql
sqllist = []
sqllist.append("update table1 set c1=0")
sqllist.append("update table1 set c2=0")
pg.Execlist(sqllist)
其他版本如Mysql,原理类似,欢迎热心的同学补充
Python操作数据库类 Oracle、Sqlserver、PostgreSQL的更多相关文章
- python操作数据库PostgreSQL
1.简述 python可以操作多种数据库,诸如SQLite.MySql.PostgreSQL等,这里不对所有的数据库操作方法进行赘述,只针对目前项目中用到的PostgreSQL做一下简单介绍,主要包括 ...
- 零基础学Python--------第11章 使用Python操作数据库
第11章 使用Python操作数据库 11.1 数据库编程接口 在项目开发中,数据库应用必不可少.虽然数据库的种类有很多,如SQLite.MySQL.Oracle等,但是它们的功能基本都是一样的,为了 ...
- Python接口测试实战3(上)- Python操作数据库
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- Python学习笔记 - day11 - Python操作数据库
MySQL的事务 MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关,MySQL的两种引擎如下: 1.MyISAM:不支持事务,用于只读程序提高性能 2.InnoDB:支持ACID ...
- 孤荷凌寒自学python第四十四天Python操作 数据库之准备工作
孤荷凌寒自学python第四十四天Python操作数据库之准备工作 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天非常激动地开始接触Python的数据库操作的学习了,数据库是系统化设计 ...
- Python操作数据库及hashlib模块
一.hashlib模块 hashlib模块,主要用于加密相关的操作,在python3的版本里,代替了md5和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA51 ...
- python操作数据库
一,安装mysql 如果是windows 用户,mysql 的安装非常简单,直接下载安装文件,双击安装文件一步一步进行操作即可. Linux 下的安装可能会更加简单,除了下载安装包进行安装外,一般的l ...
- python操作数据库之批量导入
python操作数据库之批量导入 Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进. Python具有丰富和强大的库.它常被昵称为胶水语言,能够把用其他语言制作的 ...
- Python操作数据库之 MySQL
Python操作数据库之MySQL 一.安装Python-MySQLdb模块 Python-MySQLdb是一个操作数据库的模块,Python 通过它对 mysql 数据实现各种操作. 如果要源码安装 ...
随机推荐
- mybatis的几种like查询
oracle数据库: Java代码 SELECT * FROM user WHERE name like CONCAT('%',#{name},'%') 或 Java代码 SELECT * FROM ...
- Linux kernel serial_ir_init_module()释放后重利用漏洞
受影响系统:Linux kernel < 5.1.6描述:-------------------------------------------------------------------- ...
- 昇腾CANN论文上榜CVPR,全景图像生成算法交互性再增强!
摘要:近日,CVPR 2022放榜,基于CANN的AI论文<Interactive Image Synthesis with Panoptic Layout Generation>强势上榜 ...
- ssh中pam模块造成认证失败
由于编译参数增加了pam认证 安装后发现这个模块没启用 vim /etc/ssh/sshd_config UsePAM yes 将这个模块打开后就ok了
- ZYNQ使用88E1510 PHY芯片的驱动程序
SDK V2014.4 PHY 88E1510 PL端以太网,自协商 standalone应用程序 PL端设计,略. 根据PL端生成的hdf,新建项目,采用官方lwip echo server例程.发 ...
- 使用Cobalt Strike来钓鱼(MS Office Macro)
Cobalt Strike操作 点击Cobalt Strike主界面中attacks->packages->ms office macro 弹出界面选择Listener,单机确定 对话框中 ...
- Knife4j 注解详谈
Controller层添加注解 @Api:用于类:表示标识这个类是swagger的资源 属性名称 数据类型 默认值 说明 value String "" 字段 ...
- 一个lseek引起的思考
先看一段代码: int find_value(int fd) { int ret; char buff[8] = ""; struct timeval st,ed; long lo ...
- springmvc对前台参数的接收
一.基本数据类型的接收 代码: @RequestMapping("/selectRegion") public BaseResult<?> method(String ...
- Netty学习摘记 —— UDP广播事件
本文参考 本篇文章是对<Netty In Action>一书第十三章"使用UDP广播事件"的学习摘记,主要内容为广播应用程序的开发 消息POJO 我们将日志信息封装成名 ...