一、Pymysql中Mysql连接默认会开启事务处理-数据表名行数列表SQL
PyMySQL是Python3.x版里用于连接处理MySQL业务的库,在之前的Python2版本中是使用mysqldb,使用时引入类库后直接执行connect方法,其中要注意的两个选项,设置connect_timeout控制连接时间,设置cursorclass=pymysql.cursors.DictCursor从而使mysql返回的结果中包含字段,如果不设置执行完毕返回的结果集默认以元组形式。如下示例:
python
#导入pymysql连接database
import pymysql
con = pymysql.connect(
host="",
user="",
password="",
database="",
port="",
cursorclass=pymysql.cursors.DictCursor,
connect_timeout="",
charset="utf8")
#得到一个可以执行SQL语句的对象
cursor = con.cursor()
#cursorclass也可以在连接后设置
#cursor = con.cursor(cursor=pymysql.cursors.DictCursor)
在使用PyMySQL默认都关闭了自动提交,从而在使用的时候总是要显示的调用commit方法来提交语句,在MYSQL的general日志中可以看到,所有的SQL语句 都有显示提交,但这真的有点多余,真正的业务场景中很多只是一个简单的查询,根本不用开启事务,另外事务太多也会导致数据库性能的下降(和数据库服务器的配置相关)。所以建议使用pymysql时不要开启事务。pymysql的Connection接口提供了一个选项:autocommit。在使用pymysql.connect连接的时候加上autocommit=True,所有的SQL语句就会自动提交,而在要使用事务的地方就显示设置一下关闭自动提交,所有的SQL就绪之后再提交事务即可。
另外记录一下在命令行下用来查询列出某个数据库所有数据表名行数列表的SQL语句,平常多是使用Navicat来连接MYSQL,在命令行下可以如下语句快速列出表的表名行数等内容,注使用这SQL查询时表行数不会立即更新,如果表记录有变化,需要使用表分析语句ANALYZE TABLE 表名处理一下再查询即可。
sql
#列出某个数据库所有数据表名行数列表的SQL语句
ANALYZE TABLE 表名
SELECT table_name,table_rows,DATA_LENGTH/1024/1024 "DATA_LENGTH",CREATE_TIME,TABLE_COLLATION FROM `information_schema`.`tables` WHERE TABLE_SCHEMA = '数据库名' ORDER BY table_rows DESC;
二、python中的日志模板logoru及常用参数配置解析
Python中有一个内置的日志标准库------logging,但开发中涉及到日志记录时,基本都不会采用它,因为其在配置上较为繁琐。同时在多线程或多进程的场景下,若不进行特殊处理还会导致日志记录异常。其替代品就是一个优雅、简洁的日志记录第三方库------loguru,导入封装的logger类,即可直接进行调用和日志处理,非常方便实用。
python
# 安装logoru模块
pip3 install loguru
# 引入和调用logoru
from loguru import logger
logger.debug('This is debug information')
logger.info('This is info information')
logger.warning('This is warn information')
logger.error('This is error information')
logoru自带有8种级别的日志,success/debug/trace/debug/info/warning/error/critical。也是程序开发中的常用日志级别分类。且不同的级别日志在控制台上的显示上还有颜色区分,非常一目了然。如果觉得颜色碍事,可以使用在引入 logger之后使用 logger.remove() 去掉其默认颜色特性。logger 默认采用 sys.stderr标准错误输出将日志输出到控制台中,假如想要将日志同时输出到其他的位置,一般都是日志文件,这时我们只需要调用一下方法指定一下即可。在调用loguru定义日志记录的时候常用的参数配置解析如下:
#. logoru常用参数配置解析
sink:可以传入一个 file 对象(file-like object),或一个 str 字符串或者 pathlib.Path 对象,或一个方法(coroutine function),或 logging 模块的 Handler(logging.Handler)。
format (str or callable, optional) :格式化模块,在发送到接收器之前,使用模板对记录的消息进行格式化。
level (int or str, optional) :应将已记录消息发送到接收器的最低严重级别。
encoding (str, optional) :文件编码与内置的' open() '函数相同。如果' None ',它默认为'locale.getpreferredencoding()
enqueue (bool, optional) :要记录的消息在到达接收器之前是否应该首先通过多进程安全队列。当通过多个进程将日志记录到文件中时,这是非常有用的。这还具有使日志调用非阻塞的优点。
rotation:分隔日志文件,何时关闭当前日志文件并启动一个新文件的条件,;例如,"500 MB"、"0.5 GB"、"1 month 2 weeks"、"10h"、"monthly"、"18:00"、"sunday"、"monday at 18:00"、"06:15"
#. 其它不常用选项列表
retention (str, int, datetime.timedelta or callable, optional) ,可配置旧日志的最长保留时间,例如,"1 week, 3 days"、"2 months"
filter (callable, str or dict, optional) :用于决定每个记录的消息是否应该发送到接收器。
colorize (bool, optional) -- 是否应将格式化消息中包含的颜色标记转换为用于终端着色的Ansi代码,或以其他方式剥离。如果None,根据水槽是否为TTY自动作出选择。
serialize (bool, optional) :在发送到接收器之前,记录的消息及其记录是否应该首先转换为JSON字符串。
backtrace (bool, optional) :格式化的异常跟踪是否应该向上扩展,超出捕获点,以显示生成错误的完整堆栈跟踪。
diagnose (bool, optional) :异常跟踪是否应该显示变量值以简化调试。在生产中,这应该设置为"False",以避免泄漏敏感数据。
catch (bool, optional) :是否应该自动捕获接收器处理日志消息时发生的错误。如果True上显示异常消息 sys.stderr。但是,异常不会传播到调用者,从而防止应用程序崩溃。
如果当接收器(sink)是文件路径( pathlib.Path )时,可以应用下列参数,同时add() 会返回与所添加的接收器相关联的标识符:
compression (str or callable, optional) :日志文件在关闭时应转换为的压缩或归档格式,例如,"gz"、"bz2"、"xz"、"lzma"、"tar"、"tar.gz"、"tar.bz2"、"tar.xz"、"zip"
delay (bool, optional):是否应该在配置了接收器之后立即创建文件,或者延迟到第一个记录的消息。默认为' False '。
mode (str, optional) :与内置open()函数一样的打开模式。默认为' "a"(以附加模式打开文件)。
buffering (int, optional) :内置open()函数的缓冲策略,它默认为1(行缓冲文件)。
如下即添加了一个info日志文件并进行了日志格式、滚动配置。
python
logger.add(
"./info.log",
format="{time:YYYY-MM-DD HH:mm:ss,SSS} |{level}| {file} {line} {message}",
level="INFO",
encoding="utf-8",
enqueue=True,
rotation="1 month",
retention="10 years"
)
logger.info('This is info information')