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 数据实现各种操作. 如果要源码安装 ...
随机推荐
- AT1219题解
题意 设 \(a\) 的价值为 \(a \times cnt_a\)(\(cnt_a\) 为 \(a\) 在区间中出现的次数),求区间种某种元素,使得这种元素的价值最大. 因为设计出现元素的次数,所以 ...
- chap8-fluent python
浅拷贝 VS 深拷贝 # In[] # list 生成一个新的引用对象,只是用alst完成初始化 alst = [1,2,3,4,5] blst=list(alst) alst.append(6) p ...
- 两个宝藏|关于我在github上冲浪时的一个小技巧。
你好呀,我是歪歪. 前几天在 github 上冲浪的时候,发现了两个宝藏东西. 我也不藏着掖着了,拿出来给大家分享一下. 这两个宝藏是关于 arthas 和 SOFARegistry 的,这两个东西都 ...
- MySQL — 索引
目录 1.索引概述 2.索引结构 3.索引分类 4.索引语法 5.SQL 性能分析 5.1.执行频次 5.2.慢日志查询 5.3.profile 5.4.explain 6.索引使用规则 6.1.单列 ...
- 关于linux下的open()write()read()close()函数
http://blog.sina.com.cn/s/blog_71d1a98701010s0v.html 1.read和write函数调用时,都会记录下当前写的位置,下次调用时就会从这个位置开始读或写 ...
- [SPDK/NVMe存储技术分析]012 - 用户态ibv_post_send()源码分析
OFA定义了一组标准的Verbs,并提供了一个标准库libibvers.在用户态实现NVMe over RDMA的Host(i.e. Initiator)和Target, 少不了要跟OFA定义的Ver ...
- 27.Java 飞机游戏小项目
开篇 游戏项目基本功能开发 飞机类设计 炮弹类设计 碰撞检测设计 爆炸效果的实现 其他功能 计时功能 游戏项目基本功能开发 这里将会一步步实现游戏项目的基本功能. 使用 AWT 技术画出游戏主窗口 A ...
- Java有没有goto?
goto是Java中的保留字,暂时还不是Java的关键字.
- 用 Java 写一个折半查找?
折半查找,也称二分查找.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法. 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束:如果某一特定元素大于或者小于中间元素,则 ...
- Redis 相比 Memcached 有哪些优势?
1.Memcached 所有的值均是简单的字符串,redis 作为其替代者,支持更为丰 富的数据类 2.Redis 的速度比 Memcached 快很 3.Redis 可以持久化其数据