总结:1、使用这种方法,获取到的返回值总是最后一条命令的返回值,如果最后一条命令是update或者delete这种sql,则返回为()
2、sql的每一条语句后面都需要添加一个分号,不然最后splice时候 ,会少一条语句
#-*- coding:utf-8 -*-
"""
@author:yaren_zhou
@file: DButils.py
@time: 2019/12/06 14:56
@contact: 1601704037@qq.com
@software: PyCharm
"""
import pymysql
import logging
logger = logging.getLogger(__name__) #操作日志对象
class MysqlConn():
'''
数据库连接的公共类,提供连接数据库,查询,删除语句等操作
'''
def __init__(self,dbName = None):
self.currentConn = None
self.host = "your host"
self.user = "username"
self.password = "password"
self.dbName = dbName
self.charset = "utf8mb4"
self.resultlist = []
def open(self):
try:
conn = pymysql.connect(
host = self.host,
user = self.user,
password = self.password,
db = self.dbName,
charset=self.charset,
)
except pymysql.err.OperationalError as e:
logger.exception("数据库连接失败!")
if "Errno 10060" in str(e) or "2003" in str(e):
logger.error("数据库连接失败!")
raise
logger.info(f"数据库连接成功")
self.currentConn = conn # 数据库连接完成
self.cursor = self.currentConn.cursor() # 游标,用来执行数据库
# 把多条sql拆分成单条,放进sqllist里面
def spliteSql(self,sql):
sqllist = sql.split(';')
return sqllist[0:-1]
#最后面会多一条空值
def execSql(self,sql:str,closeConn = True) -> list:
'''执行sql,支持执行多条sql语句。'''
self.open()
sqllist = self.spliteSql(sql) #先处理传入的sql语句
logger.info(f"开始执行sql语句")
with self.cursor as my_cursor:
for i in sqllist:
my_cursor.execute(i) #执行sql语句
self.resultlist = my_cursor.fetchall() #获取数据
self.currentConn.commit() #提交
if self.currentConn:
self.close()
return self.resultlist
# def execProc(self):
def close(self): #关闭连接
logger.info(f"关闭数据库连接")
if self.cursor:
self.cursor.close()
self.currentConn.close()