SQLAlchemy1.4 异步特性真香

原创
2021/03/25 07:30
阅读数 4.8K

今天整理邮件看到 SQLAlchemy 发布了 1.4 版本,其中针对异步的相关功能完全开发了出来,包括 core 和 ORM 的异步能力。虽然文档中说异步功能还处于 alpha 阶段,API 随时可能变动,但好奇的我已忍不住尝试一番。

FastApi 官方文档中推荐使用两个数据库组件 SQLAlchemy 和 databases(encode 开源的异步链接库)。SQLAlchemy 使用其 core 构建 SQL 的能力,databases 用来管理异步的数据库连接。SQLAlchemy 支持了异步数据库链接,我们就可以把 databases 去掉了。

之前我整理分享了一个 FastApi 的使用 demo 代码,大家可从 GitHub 获取代码(https://github.com/pylixm/docker-fastapi-demo),我们在它上面修改。

1、去除异步链接库 databases,使用纯 SQLAlchemy 构建异步回话 session。

# https://github.com/pylixm/docker-fastapi-demo/blob/e6719e0de878fdfb7cd1dc655bb22614876e059a/core/db.py#L22
# async
# mysql+aiomysql://user:password@host:port/dbname
async_engine = create_async_engine(
    SQLALCHEMY_ASYNC_DATABASE_URL, echo=True,
)

async_session = sessionmaker(
        async_engine, expire_on_commit=False, class_=AsyncSession
    )

2、构建 SQLAlchemy 常用的 session 回话,不过这里是异步的回话。为了让 session 回话可以重复使用,我们把它挂到 app 实例上。

# https://github.com/pylixm/docker-fastapi-demo/blob/e6719e0de878fdfb7cd1dc655bb22614876e059a/main.py#L28
    @app.on_event("startup")
    async def startup():
        app.state.se = async_session()

3、View 视图中直接调用 session 会话来操作数据库。

# https://github.com/pylixm/docker-fastapi-demo/blob/e6719e0de878fdfb7cd1dc655bb22614876e059a/service/views.py#L11
@router.get('/')
async def index(request: Request):
    print(posts.select())
    # post_list = await database.fetch_all(query=posts.select())
    post_list = await request.app.state.se.execute(posts.select())
    return templates.TemplateResponse(
        'index.html',
        {
            'request': request,
            'post_list': post_list
        }
    )

搞定,直接运行main.py即可。

通过上边的改造,FastApi 应用架构中去除了 databases 异步链接的依赖,精简了组件。从此以后我们只需要关注 SQLAlchemy 就好了,香啊。

文中完整点,可见 Github:https://github.com/pylixm/docker-fastapi-demo/tree/sqlalchemy_async

我是 DeanWu,一个努力成为真正 SRE 的人。

关注公众号「码农吴先生」, 可第一时间获取最新文章。回复关键字「go」「python」获取我收集的学习资料,也可回复关键字「小二」,加我 wx 拉你进技术交流群,聊技术聊人生~


本文分享自微信公众号 - 码农吴先生(CoderMrWu)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部
返回顶部
顶部