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 数据实现各种操作. 如果要源码安装 ...
随机推荐
- 2.6 C++STL queue详解
文章目录 2.6.1 引入 2.6.2 代码示例 2.6.3 代码运行结果 总结 2.6.1 引入 首先,在STL中 queue 和 stack 其实并不叫容器(container),而是叫适配器(a ...
- knative入门指南
尽管Knative自2018年以来一直由社区维护,但最近一直有关于该项目的传言,因为谷歌最近将Knative提交给了云原生计算基金会(CNCF),作为一个孵化项目考虑. 太酷了!但Knative到底是 ...
- python 程序小练习
print("Type integers,each followed by Enter; or just Enter to finish") total = 0 count = 0 ...
- web note
web note html note 列表 ul 无序列表 ol 有序列表 并且可以通过 type 来定义列表序号的形式 <!DOCTYPE html> <html> < ...
- 遇到REMOTE HOST IDENTIFICATION HAS CHANGED怎么办?
今日遇到如下问题: 警告的大概意思就是,主机密钥发生变更,并提示安全风险(可能存在中间人攻击) 但是事实是,这是因为我重装系统之后遇到的问题.重装系统后,指纹当然会发生变化了...在Xshell实验中 ...
- [源码解析] TensorFlow 分布式环境(4) --- WorkerCache
[源码解析] TensorFlow 分布式环境(4) --- WorkerCache 目录 [源码解析] TensorFlow 分布式环境(4) --- WorkerCache 1. WorkerCa ...
- 后门及持久化访问2----进程注入之AppCertDlls 注册表项
代码及原理介绍 如果有进程使用了CreateProcess.CreateProcessAsUser.CreateProcessWithLoginW.CreateProcessWithTokenW或Wi ...
- .NetCore(.NET6)中使用swagger和swagger版本控制
一..NET6中使用swagger swagger支持 API 自动生成同步的在线文档,下面在.NET6中引入 1.建.NET6应用并建以下控制器 /// <summary> /// 订单 ...
- 羽夏看Win系统内核—— VT 入门番外篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- JavaScript 02 运算符,分支结构
一元换算符 字符串类型 对于字符串,来说自增或自减会自动进行类型转换 1.var str = '10' 自动转换 从string转为number 2.str++ NaN 对于转化不成功的string类 ...