简单介绍我的开源小工具:SanicDB

  

  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):   之前   

  ,   

  

  示例   

  

  代码仓库中有两个示例:   

简单介绍我的开源小工具:SanicDB