SanicDB是为Python的异步网框架Sanic方便操作MySQL而开发的工具,是对aiomysql。池的轻量级封装.Sanic是异步IO的Web框架,同时用异步IO读写MySQL才能更大发挥它的效率,虽然这个模块叫做SanicDB,但是它可以用在任何异步IO操作MySQL的地方。
SanicDB的灵感来源于龙卷风里面的对MySQLdb (MySQL的C语言接口的Python封装)的操作,后来龙卷风把它去除了,就有人把这部分代码写成一个单独的模块叫做torndb, torndb是对python-mysql的封装,不能进行异步操作。但是它很简洁,用起来已经非常习惯了。
在用Sanic的时候,发现有异步IO的aiomysql可以用,但是用起来还有点麻烦,于是就着手对aiomysql进行封装,既然aiomysql支持连接池,那就直接封装aiomysql.Pool吧。
代码仓库:https://github.com/veelion/sanicdb
首先,看看它的初始化
<前> class SanicDB:“““A lightweight wrapper around aiomysql.Pool for easy 用使用 “““def  __init__(自我,,主机,数据库,用户,密码, ,,,,,,,,,,,,循环=没有,sanic=没有 ,,,,,,,,,,,,minsize=3,,最大尺寸=5, ,,,,,,,,,,,,return_dict=True, ,,,,,,,,,,,,pool_recycle=7 * 3600, ,,,,,,,,,,,,autocommit=True, ,,,,,,,,,,,,charset =,“utf8mb4",, * * kwargs): & # 39; & # 39; & # 39; >之前前面4个参数是对应数据库的;
循环是你的应用程序中的事件循环(event_loop);
sanic是你的sanic应用中的sanic对象;
这在__init__()代码中可以看的到。
微型和最大容量是连接池的个数限制;
return_dict是返回的数据一条记录为一个东西,关键是MySQL表的字段名,值是字段的值;
pool_recycle是连接池重连的时间间隔,MySQL默认的连接闲置时间是8小时;
对MySQL的读写操作方法:
从代码中可以看的到,以上三个函数都是调用的光标的执行()执行SQL命令,但查询是(),有()用于读操作返回数据,查询返回全部数据(列表),得到只返回一条数据。
execute()方法用来执行写操作,返回受影响的行ID。
上面三个函数都是一样的:
查询是要执行SQL语的句,后面两个参数是用来参数化执行SQL语句的。参数化执行SQL是为了防止SQL注入的,那么参数化执行SQL是什么意思呢,举个例子就目标了。
比如,进行用户登录时,我们要执行一条SQL, Python拼接SQL如下:
<前> 时间=sql “select  *,得到user where name=& # 39; % & # 39;,以及密码=& # 39;% & # 39;“,%,(input_name, input_password) >之前input_name和input_password都是用户输入的,如果用户想捣的鬼,他把input_name输入成“' or 1=1——”,拼接出来的sql就成了:
<前> select *,得到user where name=& # 39; & # 39;,或1,=,- 1,- & # 39;,以及密码=& # 39;任何# 39; >之前或后面的1=1就是真的,而-后面都成了注释,这条语句不管input_name, input_password是什么都可以执行,通过用户验证,达到了注入目的。
参数化执行SQL就是把拼接SQL的任务交给SanicDB(实际上是它后的aiomysql后面的pymysql),我们只把要拼接的参数当做*参数传给读写方法即可:
<前> mydb.query (“select  *,得到user where 用户=% s 以及密码=% s",, input_name,, input_password) >之前更高级的封装:
query(),(),()就执行是基本的操作,在此基础上,做了进一步封装,让写应用更方便:
<前> #,检查一个表中是否含有某字段为某值的记录async def table_has(自我,,table_name,,,,值):,#,把一个东西插入一个表,项目为dict类型,关键是字段名,#,ignore_duplicated为真时,遇到唯一索引重复时不报错async def table_insert(自我,,table_name,,,, ignore_duplicated=True):, #,更新一个表的记录,更新是dict类型,为关键字段名async def table_update (table_name,自我,更新,,field_where,, value_where): >之前,
示例
代码仓库中有两个示例: