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 数据实现各种操作. 如果要源码安装 ...
随机推荐
- 2022最新IntellJ IDEA的mall开发部署文档
目录 版本说明 一.概述 二.基本构建 三.Git 导入编译器 四.模块描述浅析 五.配置文档 application.yml修改,涉及模块 application-dev.yml修改,涉及模块 ge ...
- 绕过WAF进行常见Web漏洞利用
前言 本文以最新版安全狗为例,总结一下我个人掌握的一些绕过WAF进行常见WEB漏洞利用的方法. PS:本文仅用于技术研究与讨论,严禁用于任何非法用途,违者后果自负,作者与平台不承担任何责任 PPS:本 ...
- 查找bug的一些经验总结
项目开发中遇到的bug解决经验总结 今天在项目开发中遇到了两个很难解决的bug,我把我的思路记录下来,以供之后遇到bug时,提供一些思路: 编译通过,但总结"core dumped" ...
- python爬虫 Selenium库学习
一.自动化测试工具,支持多种浏览器,解决JS渲染问题 二.安装 pip3 install Selenium 三.操作介绍(因为是学习别人的课程为了尊重知识产权,部分代码就不显示了) 1驱动浏览器 br ...
- java面试-四维图新
1.给出至少三种排序方式,并写出详细实现思路. /** * 快速排序 * @param arr * @param low * @param high */ public static void qui ...
- Spring Boot 的核心配置文件有哪几个?它们的区别是什么?
Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件.application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置.b ...
- Gradle 使用@Value注册编译报错
报错信息:Expected '$(student - name)' to be an inline constant of type java.lang.String in @org.springfr ...
- chubby 是什么,和 zookeeper 比你怎么看?
chubby 是 google 的,完全实现 paxos 算法,不开源.zookeeper 是 chubby的开源实现,使用 zab 协议,paxos 算法的变种.
- Java 中,Maven 和 ANT 有什么区别?
虽然两者都是构建工具,都用于创建 Java 应用,但是 Maven 做的事情更多, 在基于"约定优于配置"的概念下,提供标准的 Java 项目结构,同时能为应用自 动管理依赖(应用 ...
- WebSQL是HTML 5规范的一部分吗?
不是,虽然很多人将其标记为HTML 5,但它不是HTML 5规范的一部分.HTML 5规范基于SQLite.