- 因为用到联合运算符
|
,所以python的版本需要>=3.10
# -*- coding: UTF-8 -*-
"""
执行带参数的SQL时,使用'%s'占位,用tuple/list进行条件匹配
在格式SQL中不需要使用引号指定数据类型,系统会根据输入参数自动识别
在输入的值中不需要使用转意函数,系统会自动处理
"""
import pymysql
from pymysql.cursors import DictCursor
from dbutils.pooled_db import PooledDB
class MySql(object):
"""
MYSQL数据库对象,产生数据库连接 , 此类中的连接采用连接池实现
"""
def __init__(self):
"""
数据库构造函数,从连接池中取出连接,并生成操作游标
"""
# 连接池对象
self.__pool = PooledDB(creator=pymysql,
mincached=1,
maxcached=20,
host="localhost",
port=3306,
user="root",
passwd="password",
db="database_name",
use_unicode=True,
charset="utf8mb4",
cursorclass=DictCursor)
self._conn = self.__pool.connection()
self._cursor = self._conn.cursor()
def get_all(self, sql: str, param: list | tuple = None) -> list[dict] | None:
"""
执行查询,并取出所有结果集
:param sql: 查询的SQL语句,如果有查询条件,请只指定条件列表,并将条件值使用参数'param'传递进来
:param param: 可选参数,条件列表
:return: 查询到的结果集
"""
if param is None:
param = []
self._cursor.execute(sql, param)
return self._cursor.fetchall() or None
def get_one_row(self, sql: str, param: list | tuple = None) -> dict | None:
"""
执行查询,并取出第一条
:param sql: 查询的SQL语句,如果有查询条件,请只指定条件列表,并将条件值使用参数'param'传递进来
:param param: 可选参数,条件列表
:return: 查询到的结果集
"""
if param is None:
param = []
self._cursor.execute(sql, param)
return self._cursor.fetchone()
def get_one_data(self, sql: str, param: list | tuple = None) -> int | str | None:
"""
执行查询,并取出第一条的第一个数据
:param sql: 查询的SQL语句,如果有查询条件,请只指定条件列表,并将条件值使用参数'param'传递进来
:param param: 可选参数,条件列表
:return: 查询到的结果/None
"""
if param is None:
param = []
self._cursor.execute(sql, param)
data = self._cursor.fetchone()
return data and list(data.values())[0]
def insert_one(self, sql: str, value: list | tuple) -> int:
"""
向数据表插入一条记录
:param sql: 执行的SQL语句
:param value: 插入的记录数据
:return: 插入记录的id值
"""
self._cursor.execute(sql, value)
return self._cursor.lastrowid
def insert_many(self, sql: str, values: list[list] | tuple[tuple]) -> int:
"""
向数据表插入多条记录
:param sql: 执行的SQL语句
:param values: 插入的记录数据集
:return: 受影响的行数
"""
self._cursor.executemany(sql, values)
return self._cursor.rowcount
def __query(self, sql: str, param: list | tuple) -> int:
if param is None:
param = []
self._cursor.execute(sql, param)
return self._cursor.rowcount
def update(self, sql: str, param: list | tuple = None) -> int:
"""
更新数据表记录
:param sql: 执行的SQL语句
:param param: 更新的数据列表
:return: 受影响的行数
"""
return self.__query(sql, param)
def delete(self, sql: str, param: list | tuple = None) -> int:
"""
删除数据表记录
:param sql: 执行的SQL语句
:param param: 删除的条件列表
:return: 受影响的行数
"""
return self.__query(sql, param)
def commit(self, is_end: bool = True) -> None:
"""
提交事务
:param is_end: 可选参数,默认为True:提交事务,False:回滚事务
"""
if is_end:
self._conn.commit()
else:
self._conn.rollback()
def dispose(self, is_end: bool = True):
"""
释放连接资源
:param is_end: 可选参数,默认为True:提交事务,False:回滚事务
"""
self.commit(is_end)
self._cursor.close()
self._conn.close()
def __del__(self):
self.dispose()
结束~~~