专栏首页大猪的笔记sanic(4):增加mysql数据库与redis支持

sanic(4):增加mysql数据库与redis支持

项目结构

依据上文,我们已经可以做出后台,也能使用jinja2来渲染页面。下面简单讲讲如何给sanic项目添加mysql和redis支持。

|-- README.md
|-- app.py
|-- handlers
|   |-- __init__.py
|   |-- __pycache__
|   |-- admin_api
|   |-- index.py
|-- run_qb_games.py
|-- shutdown.sh
|-- sql.txt
|-- srvconf.py
|-- templates
|   |-- 404_v3.html
|   |-- 500_v3.html
|   `-- web
|       |-- index.html

安装插件

sanic可以开心的使用异步mysql与异步redis,首先需要的是安装插件,当然,mysql和redis的服务是必须有的。本文就不涉及了。

python3.6 -m pip install aioredis
python3.6 -m pip install aiomysql

初始化

安装完毕后,打开app.py文件。在之前的setup_db_redis函数中添加内容:

@app.listener('before_server_start')
async def setup_db_redis(app, loop):
    app.db = await aiomysql.create_pool(
    host=srvconf.mysql_host,
    port=srvconf.mysql_port,
    user=srvconf.mysql_user,
    password=srvconf.mysql_password,
    db=srvconf.database, loop=loop, charset='utf8', autocommit=True)

    app.redis_pool = await aioredis.create_pool(
        (srvconf.redis_host, srvconf.redis_port),
        minsize=5,
        maxsize=10,
        loop=loop
    )
    ...

在项目运行的时候,将db pool和redis pool保存到app对象中。

项目结束关闭资源

创建了pool,在项目关闭的时候就得把资源释放。在app.py中添加代码如下:

@app.listener('after_server_stop')
async def close_db_redis(app, loop):
    app.db.close()
    await app.db.wait_closed()

    app.redis_pool.close()
    await app.redis_pool.wait_closed()

mysql操作

涉及到数据库话题就很大了,在本文中,只讲简单的操作,不涉及高级用法,具体见aiomysql的文档。

查询

使用mysql pool创建一个查询,代码如下:

async with app.db.acquire() as conn:
    async with conn.cursor(aiomysql.DictCursor) as cur:
        await cur.execute(self.sql, self.values)
        r = await cur.fetchall()

注意,在self.sql中是需要参数化传值的。用%s做占位符。 r返回一个数组,每行是一个字典。字典的Key为数据库字段,值为数据值。

删除、修改

    async with app.db.acquire() as conn:
        async with conn.cursor() as cur:
            await cur.execute(self.sql, self.values)
            ret = await conn.commit()
            return ret

新增

如果插入一个行新的内容,希望得到自动增长的ID。此时,可以使用lastrowid获取:

async with app.db.acquire() as conn:
    async with conn.cursor() as cur:
        await cur.execute(self.sql, self.values)
        await conn.commit()
        ret = cur.lastrowid
        return ret

redis使用

安装好了redis和相关的py插件,就能在sanic中轻松使用了。

get值

async with app.redis_pool.get() as redis:
    response = await redis.get(key)

set值,并设置timeout

async with app.redis_pool.get() as redis:
    await redis.setex(key, timeout, response_cached)

还有一些其它的高级用法,请查看aioredis的文档吧。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • sanic(1):创建app

    sanic是一个非常NB的高性能python框架。最近正好公司有一个小项目。所以用sanic来试试手是很不错的了。 由于sanic的中文资料和项目还很少很少,...

    超级大猪
  • go笔记:go语言继承和简易工厂

    超级大猪
  • docker笔记:手工编译docker

    4/  在home/docker/docker下,如果没有autogen文件夹,那就建一个。下辖dockerversion/dockerversion.go

    超级大猪
  • Linux系统管理员应该知道的journalctl知识

    通过--since和--until选项,可以过滤任意时间限制,显示指定条件之前、之后或之间的日志。

    大江小浪
  • docker 单机配置redis主从集群 集群 前置准备

    该文是docker redis主从配置 正式部署的前言。如下会简要列出目录,需要了解的前置知识,以防配置时出错。 如果你还不够了解,就阅读正文的相应章节。

    平凡的学生族
  • Akka 指南 之「监督和监控」

    本章概述了监督(supervision)背后的概念、提供的原语及其语义。有关如何转换为真实代码的详细信息,请参阅 Scala 和 Java API 的相应章节。

    CG国斌
  • matlab倒立摆强化学习训练

    Actor(玩家):为了得到尽量高的reward,实现一个函数:输入state,输出action。用神经网络来近似这个函数。目标任务就是如何训练神经网络,让它的...

    万木逢春
  • 巧用外部表避免大量的insert (r4笔记第71天)

    昨天开发咨询我一个问题,希望我对下面的语句进行调优。 语句类似下面的形式 SELECT subscriber_no FROM SUBSCRIBER S W...

    jeanron100
  • ETH活跃地址数猛增,与LTC形成对比;平均网络传输时间再创新低0.39秒,全球节点分布国家依旧持续攀升 | 数据周榜

    出品 | CSDN、amberdata.io、区块链大本营(blockchain_camp)

    区块链大本营
  • centos7安装图形化界面

    对于新手来说购买服务器(vps)linux系统默认是没有图形化界面的,新手需要图形化界面我们就要自行去安装了!

    十月梦想

扫码关注云+社区

领取腾讯云代金券