'''
数据库的三个基本封装
1)链接数据库
2)执行sql语句
3)关闭数据库
'''
import pymysql
# 获取链接对象
def my_connect(dbinfo):
try:
conn = pymysql.connect(user=dbinfo['user'], password=dbinfo['pwd'], host=dbinfo['host'], port=dbinfo['port'], database=dbinfo['database'],
charset=dbinfo['charset'])
print("数据库链接成功")
return conn
except Exception as e:
print(f"数据库链接失败:{e}")
# 执行sql操作
def my_execute(conn,sql):
try:
# 链接对象获取游标对象
cs = conn.cursor()
# 游标可以去执行sql语句
# sql = "select * from stu"
# sql = "update stu set name='tom1' where id = 1"
cs.execute(sql)
# 提交
conn.commit()
# 游标获取sql语句的返回信息
r = cs.fetchall()
print(f"执行sql语句{sql}成功")
return r
except Exception as e:
print(f"执行sql语句{sql}出错")
# 关闭
def my_close(conn):
try:
conn.close()
print(f"关闭数据库成功")
except Exception as e:
print(f"关闭数据库失败")
# 删除所有用户,除了admin
def delete_all(dbinfo):
con = my_connect(dbinfo)
sql = "delete from sys_user where account != 'admin'"
my_execute(con,sql)
my_close(con)
# 添加信息 根据用户名和邮箱
def insert_by_account_and_email(dbinfo,account,email):
con = my_connect(dbinfo)
sql = f"INSERT INTO `ranzhi`.`sys_user` (`dept`, `account`, `password`, `realname`, `role`, `nickname`, `admin`, `avatar`, `birthday`, `gender`, `email`, `skype`, `qq`, `yahoo`, `gtalk`, `wangwang`, `site`, `mobile`, `phone`, `address`, `zipcode`, `visits`, `ip`, `last`, `ping`, `fails`, `join`, `locked`, `deleted`, `status`) VALUES ( 0, '{account}', 'c7122a1349c22cb3c009da3613d242ab', 'admin', '', '', 'super', '', '2000-02-02', 'u', '{email}', '', '', '', '', '', '', '', '', '', '', 304, '127.0.0.1', '2026-07-23 17:10:25', '2026-07-23 17:27:54', 0, '2026-05-08 10:44:58', '2000-10-10 10:02:02', '0', 'offline');"
my_execute(con,sql)
my_close(con)
# 根据用户名删除信息
def delete_by_account(dbinfo,account):
con = my_connect(dbinfo)
sql = f"delete from sys_user where account = '{account}'"
my_execute(con,sql)
my_close(con)
if __name__ == '__main__':
dbinfo = {"user": 'root', 'pwd': '123456', 'host': '127.0.0.1', 'port': 3306, 'database': 'ranzhi',
'charset': 'utf8'}
# delete_by_account(dbinfo,"aaa")
# delete_all(dbinfo)
insert_by_account_and_email(dbinfo,'111','kasdf@dsjf.com')
'''
1)python的内置库:logging 用来管理日志
2)日志的级别:debug info warning error critical
DEBUG
最详细的日志级别,输出程序运行时的内部状态和变量值
主要用于开发阶段的调试和问题诊断
生产环境通常关闭此级别日志
INFO
记录程序正常运行的关键节点信息
用于确认系统按预期工作,如服务启动、配置加载等
适合生产环境的基础监控
WARNING
表示非预期但可恢复的异常情况
例如磁盘空间不足、网络延迟等潜在问题
程序仍能继续运行但需要关注
ERROR
标记功能模块执行失败的重要错误
如数据库连接失败、API调用异常等
需要立即干预但不会导致程序终止
CRITICAL
最高级别,表示系统级致命错误
例如内存溢出、关键服务崩溃等
通常会导致程序不可恢复地终止运行
3)日志默认级别:warning,日志中的内容是向上兼容的,设置级别为info,日志中的内容:info warning error critical
'''
import logging
import sys
from ranzhiProject.caw.read_file import get_project_path
class Logger:
def __init__(self):
# 创建日志对象
self.logger = logging.getLogger()
self.logger.setLevel("INFO")
def console(self,levle,message):
'''
日志对象需要设置处理器handler,handler决定了日志打印在控制台还是写入文件中,日志的格式等
文件日志处理器FileHandler,有了他,日志就能写入文件中了
filename:日志文件路径及名称(支持绝对/相对路径)
mode:文件打开模式(默认追加模式 'a',或覆盖写入模式 'w')
encoding:文件编码格式(默认系统编码,可指定为 'utf-8')
控制台打印日志处理器 StreamHandler,能将日志打印在控制台
'''
#文件日志处理器FileHandler
filename = get_project_path() + "\\" + "logs\\log.txt"
filehandler = logging.FileHandler(filename=filename,mode="a",encoding="utf-8")
# 日志的打印格式
formater = logging.Formatter('[%(asctime)s]-[%(filename)s]-[%(levelname)s]:%(message)s')
filehandler.setFormatter(formater)
# 日志对象添加处理器
self.logger.addHandler(filehandler)
#控制台打印日志处理器 StreamHandler
syshandler = logging.StreamHandler(sys.stdout)
syshandler.setFormatter(formater)
self.logger.addHandler(syshandler)
if levle == "DEBUG":
self.logger.debug(message)
elif levle == "INFO":
self.logger.info(message)
elif levle == "WARNING" :
self.logger.warning(message)
elif levle == "ERROR" or levle=="Error":
self.logger.error(message)
else:
self.logger.critical(message)
# 为避免重复打印日志,要移除处理器handler
self.logger.removeHandler(filehandler)
self.logger.removeHandler(syshandler)
# 关闭文件处理器
filehandler.close()
def debug(self,message):
self.console("DEBUG",message)
def info(self,message):
self.console("INFO", message)
def warning(self,message):
self.console("WARNING", message)
def error(self,message):
self.console("ERROR", message)
def critical(self,message):
self.console("CRITICAL", message)
if __name__ == '__main__':
logger = Logger()
logger.info("this is info")
logger.debug("this is debug")
logger.warning("this is warning")
logger.error("this is error")
logger.critical("this is critical")