前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sanic(4):增加mysql数据库与redis支持

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

作者头像
超级大猪
发布2019-11-21 20:33:18
4.7K0
发布2019-11-21 20:33:18
举报
文章被收录于专栏:大猪的笔记

项目结构

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

代码语言:javascript
复制
|-- 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的服务是必须有的。本文就不涉及了。

代码语言:javascript
复制
python3.6 -m pip install aioredis
python3.6 -m pip install aiomysql

初始化

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

代码语言:javascript
复制
@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中添加代码如下:

代码语言:javascript
复制
@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创建一个查询,代码如下:

代码语言:javascript
复制
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为数据库字段,值为数据值。

删除、修改

代码语言:javascript
复制
    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获取:

代码语言:javascript
复制
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值

代码语言:javascript
复制
async with app.redis_pool.get() as redis:
    response = await redis.get(key)

set值,并设置timeout

代码语言:javascript
复制
async with app.redis_pool.get() as redis:
    await redis.setex(key, timeout, response_cached)

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-07-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目结构
  • 安装插件
  • 初始化
  • 项目结束关闭资源
  • mysql操作
    • 查询
      • 删除、修改
        • 新增
        • redis使用
          • get值
            • set值,并设置timeout
            相关产品与服务
            云数据库 Redis
            腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档