SanicDB 是为 Python的异步 Web 框架 Sanic 方便操作MySQL而开发的工具,是对 aiomysql.Pool 的轻量级封装。Sanic 是异步IO的Web框架,同时用异步IO读写MySQL才能更大发挥它的效率。虽然这个模块叫做 SanicDB,但是它可以用在任何异步IO操作MySQL的地方。

SanicDB的灵感来源于tornado里面的对MySQLdb(MySQL的C语言接口的Python封装)的操作,后来tornado把它去除了,就有人把这部分代码写成一个单独的模块叫做 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 to use
"""
def __init__(self, host, database, user, password,loop=None, sanic=None,minsize=3, maxsize=5,return_dict=True,pool_recycle=7*3600,autocommit=True,charset = "utf8mb4", **kwargs):
'''

前面4个参数是对应数据库的;

loop 是你的应用程序中的事件循环(event_loop);

sanic 是你的Sanic 应用中的sanic 对象;

loop 和 sanic 两者只需提供一个即可,当同时存在时,连接数据库其实用的是sanic里面的loop,这在__init__()代码中可以看到。

minisize 和 maxsize 是连接池的个数限制;

return_dict 是返回的数据一条记录为一个dict,key是MySQL表的字段名,value是字段的值;

pool_recycle 是连接池重连的时间间隔,MySQL默认的连接闲置时间是8小时;

对MySQL的读写操作方法:

async def query(self, query, *parameters, **kwparameters): 
async def execute(self, query, *parameters, **kwparameters):
async def get(self, query, *parameters, **kwparameters):

从代码中可以看到,以上三个函数都是调用的cursor的execute() 执行 SQL 命令,但是query(), get() 用于读操作返回数据,query返回全部数据(list),get只返回一条数据。

execute() 方法用来执行写操作,返回受影响的行ID。

上面三个函数都是一样的:

query 是要执行的SQL语句, 后面两个参数是用来参数化执行sql语句的。参数化执行sql是为了防止SQL注入的,那么参数化执行SQL是什么意思呢,举个例子就目标了。

比如,进行用户登录时,我们要执行一条SQL,Python拼接SQL如下:

sql = "select * from user where name='%s' and password='%s'" % (input_name, input_password)

input_name 和 input_password 都是用户输入的,如果用户想捣鬼,他把input_name 输入成 “ ‘ or 1 = 1 –”,拼接出来的sql就成了:

select * from user where name='' or 1 = 1 --' and password='anything'

or 后面的 1=1 就是True,而 — 后面都成了注释,这条语句不管input_name, input_password 是什么都可以执行,通过用户验证,达到了注入目的。

参数化执行SQL就是把拼接SQL的任务交给SanicDB(实际上是它后的aiomysql后面的pymysql),我们只把要拼接的参数当做*parameters传给读写方法即可:

mydb.query("select * from user where user=%s and password=%s", input_name, input_password)

更高级的封装:

query(), get(), execute() 就是基本的操作,在此基础上,做了进一步封装,让写应用更方便:

# 检查一个table中是否含有某字段为某值的记录

async def table_has(self, table_name, field, value):# 把一个item插入一个表,item为dict,key是字段名,# ignore_duplicated为True时,遇到唯一索引重复时不报错

async def table_insert(self, table_name, item, ignore_duplicated=True):# 更新一个table的记录,updates是dict,key为字段名

async def table_update(self, table_name, updates, field_where, value_where):

示例

代码仓库中有两个示例:

test.py 是在普通asyncio程序中使用异步MySQL的例子

example.py 是在Sanic Web中使用的例子

特别说明一下,Sanic 对象 app 中还没有生成 event_loop 对象(它是在app.run() 之后生成的),所以在Sanic中初始化SanicDB时(app.run())之前,运行sql语句会报错。如果需要创建连接后初始化运行一些SQL操作,可以利用Sanic的Listner:

@app.listener('before_server_start')
async def setup_db(app, loop):app.db = await db_setup()

文章首发于我的技术博客猿人学Python基础教程

转载于:https://www.cnblogs.com/amiza/p/10313153.html

python自学笔记之开源小工具:SanicDB介绍相关推荐

  1. Python自学笔记6:实操案例三(十进制转换二、八、十六进制),手机充值,计算能量消耗,预测未来子女身高

    Python自学笔记6:实操案例三(十进制转换二.八.十六进制),手机充值,计算能量消耗,预测未来子女身高 杨淑娟老师网课传送门(非广告):https://www.bilibili.com/video ...

  2. python自学笔记

    https://www.cnblogs.com/secondtonone1/p/6796323.html 恋恋风辰 python自学笔记(一) 我没学过python,通过网上和一些图书资料,自学并且记 ...

  3. Python自学笔记9:实操案例六(千年虫,购物流程)

    Python自学笔记9:实操案例六(千年虫,购物流程) 网课传送门:第155,156讲,https://www.bilibili.com/video/BV1Sw411Z779?p=155 1.千年虫 ...

  4. 14个超级牛X的免费开源小工具!

    最近整理了一些在用的,感觉还不错的开源小工具,有的仅适用MacOS,但多数跨平台. Homebrew Homebrew - The missing package manager for macOS: ...

  5. Python(自学笔记1)

    文章目录 一.数据类型 二.字符串 三.列表 四.用python写一个游戏 五.改进小游戏 一.数据类型 整型 布尔类型:true/false(bool) 浮点型 记法 ==Int()==括号内必须与 ...

  6. 尚硅谷Python自学笔记

    文章目录 尚硅谷Python自学笔记 计算基础知识 进制 文本文件和字符集 Python介绍 Python入门 Pytho基本语法 数值 字符串 对象(Object) 对象的结构 算数运算符 条件判断 ...

  7. 字节跳动大佬的Python自学笔记.pdf

    1. 字节跳动大佬的Python自学笔记 这是我的一个朋友自学资料包,通过这个资料包自学拿到了字节跳动的Offer, 下面是他之前入门学习Python时候的学习资料,非常全面,从Python基础.到w ...

  8. python 24位图转 8位_Python爬取PPT模板小工具下载-Python爬取PPT模板小工具免费版下载v1.0...

    由于很多PPT抓取工具都会因为版本问题无法使用,所以论坛大神就自己写了这款Python爬取PPT模板小工具,可以帮助用户轻松获取各种PPT模板,使用的时候注意一次只能下载一种类型.软件仅供交流学习,下 ...

  9. Python 自学笔记(教程)(七)

    Python 自学笔记(教程)(七) 代码 代码讲解 import time time.sleep() random random.randint() % 传送门 代码 今天的笔记很简单,就用课程作业 ...

最新文章

  1. 莫队 ---- 值域分块处理优化字典树上的查询 杭电多校2021第二场1004 i love counting
  2. android点滴 之 进度条
  3. 【tf.keras】tf.keras使用tensorflow中定义的optimizer
  4. mysql 主主+ Keepalived 高可用
  5. Sms中关于操作系统的部署之上
  6. Eclipse相关问题总结
  7. Windows组策略完善主机安全整改实战(1)
  8. C# 依赖注入那些事儿
  9. flask框架(三):flask配置文件
  10. -bash: ssh-copy-id: command not found解决方法
  11. 五大列级庄_走进法国波尔多五大一级酒庄
  12. 工具--nssm详解
  13. 基于 MPC 控制算法的自适应巡航系统的研究
  14. Android逆向工程实例 -- 善领安卓版DSA APP手势操作bug修复
  15. 如何公众号运营好一个公众号
  16. 2018中国大学生程序设计竞赛 - 网络选拔赛
  17. Ubuntu14安装配置samba共享功能
  18. 基于STM32,TB6612,TCRT5000的简易红外循迹小车
  19. Windows安装Apache服务器及证书
  20. [北大肖臻-区块链技术与应用笔记]第三节课——共识机制

热门文章

  1. 天池四月读书会|数据分析金融量化,6场直播,6位大咖,6个项目实战
  2. 新手教程:用像素游戏制作大师MV开发游戏(一)
  3. Unity新手教程:Roll-a-Ball游戏开发中的使用
  4. Linux复习资料(一)、VM虚拟机安装教程
  5. MySQL复习资料(九)——MySQL-图形化工具使用
  6. mysql workbench画E-R图,并根据E-R生成sql(步骤超完整)
  7. Python编程专属骚技巧8
  8. 一个释放临时表空间的实例
  9. JavaWeb第三讲 JSP内置对象、基本动作指令、常见编译指令及四大作用域
  10. 20175213 2018-2019-2 《Java程序设计》第6周学习总结