关于Tornado+sqlalchemy+aiomysql实现mysql查询

前阶段上级给了任务,让我做一个后端能抗得住高并发的,我一想,抗高并发不就是扩展集群负载均衡等等等...

但是上级不是这么个要求,他说:你用Tornado,对于我这学了两三年Java的小菜鸡,自然不知道Tornado是啥(因为平时不是闲着蛋疼啥都了解),所以我就问了度娘,哟西是Python的框架,采用异步非阻塞的IO,支持WebSocket和安全性功能,适合实时通信和大规模请求处理.....然后我就边看文档边上手了。

大家都知道Java的层级结构是很分明的,所以我刚上手Tornado还很不习惯,这玩意儿怎么跟隔壁node.js一样从一个app开始哇!脚手架呢?!没有??所以就写的贼难受

首先来一个app.py,当然这边的路由最好也封装一下,我太懒了......

from tornado import web, ioloop
from Handler.UserHandler import queryAll


def make_app():
    return web.Application([
        (r"/", queryAll)
    ])


if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    ioloop.IOLoop.current().start()

然后就是配置层(config),我写了个数据库的信息和连接:

db_config = {
    'host': "localhost",
    'port': 3306,
    'username': "root",
    'password': "root",
    'database': "user_db"
}
from sqlalchemy.ext.asyncio import create_async_engine
from Config.db import db_config# 导入配置

engine = create_async_engine(
    f"mysql+aiomysql://{db_config.get('username')}:{db_config.get('password')}@{db_config.get('host')}:{db_config.get('port')}/{db_config.get('database')}"
)

这段代码使用sqlalchemy.ext.asyncio模块创建了一个异步的MySQL数据库引擎。在引擎的配置中,使用了一个名为db_config的字典对象,该对象包含了数据库的相关配置信息,比如用户名、密码、主机、端口和数据库名等。

调用create_async_engine()函数创建异步引擎对象,传入了MySQL连接字符串作为参数。连接字符串使用了f-string的语法,将db_config中的配置信息动态地拼接到连接字符串中。

engine变量将持有创建的异步引擎对象,可以进一步使用它来进行数据库操作。这个异步引擎可以与Tornado等异步框架搭配使用,以实现高性能、非阻塞的数据库访问。

然后就是之前被跨域坑惨过,所以我现在都习惯性先写跨域配置类,这边也给正在初学的你们一个示例代码,具体需要再根据个人修改哈~

from tornado import web


#   跨域配置类
class CorsHandler(web.RequestHandler):
    def set_default_headers(self):
        self.set_header("Access-Control-Allow-Origin", "http://localhost:8888/")  # 跨域的域名或者ip
        self.set_header("Access-Control-Allow-Credentials", "true")
        self.set_header("Access-Control-Allow-Headers", "Authorization")
        self.set_header('Access-Control-Allow-Methods', 'POST, GET, PATCH, PUT, DELETE, JSONP, OPTIONS')
        self.set_header("Access-Control-Max-Age", 1000)
        self.set_header("Content-type", "application/json")

    def option(self):
        self.set_status(200)
        self.finish()

然后就是定义数据模型啦,新建一个model文件夹作为模型层,然后根据表结构(我的表只有id,username,password)所以就比较简单:

from sqlalchemy import Column, Integer, String, select, insert, update, delete
from sqlalchemy.orm import declarative_base

Base = declarative_base()


class User(Base):
    __tablename__ = 'user'
    user_id = Column(Integer, primary_key=True)
    username = Column(String(255))
    password = Column(String(255))

    @classmethod
    def select(cls):
        return select(cls)

    @classmethod
    def insert(cls):
        return insert(cls)

    @classmethod
    def update(cls):
        return update(cls)

    @classmethod
    def delete(cls):
        return delete(cls)

这段代码使用了SQLAlchemy库来定义一个名为User的ORM(对象关系映射)模型类,并定义了常用的数据库操作方法。

首先,通过导入相关模块和函数,创建了ColumnIntegerString等列类型,并调用declarative_base()函数创建了一个名为Base的基类。

然后,定义了User类,它继承自Base类。在User类中,使用__tablename__属性指定了数据库中对应的表名为"user"。接着,定义了三个字段:user_idusernamepassword,分别表示用户ID、用户名和密码。

接下来,使用@classmethod装饰器定义了四个类方法,分别是select()insert()update()delete()。这些方法返回的是相应的SQLAlchemy查询对象,可以用于执行对应的数据库操作。例如,User.select()返回一个select查询对象,可以用于查询User表中的数据。

这样,通过定义这个User类以及相应的查询方法,可以方便地进行数据库操作,例如查询用户数据、插入新的用户、更新用户信息和删除用户等操作。

模型层定义好后我们接着写接口,前面app.py里面的路由是为了看这篇文章的小伙伴方便复制,不然写接口的时候还是要先写接口再写路由哦,这是好习惯~

这里定义一个handler层作为控制层,然后把写一个UserHandler.py写用户表相应的接口:

import json

from Handler.CorsHandler import CorsHandler
from Config.conn import engine
from Model.User import User
from sqlalchemy.ext.asyncio import AsyncSession


class queryAll(CorsHandler):  # 获取用户列表
    async def get(self):
        # 创建异步会话
        async with engine.begin() as conn:
            # 执行查询
            result = await conn.execute(User.select())
            users = result.all()
            # 将查询结果转为字典列表
            user_list = []
            for user in users:
                user_info = {'user_id': user.user_id, 'username': user.username, 'password': user.password}
                user_list.append(user_info)
            # 转换成json格式响应输出
            self.write(json.dumps(user_list))

然后运行python3 app.py ,访问 http://localhost:8888/ 就能看到数据库的用户列表咯!如果运行不起来的小伙伴看看有没有安装对应的依赖这些的:

pip3 install tornado
pip3 install sqlalchemy
pip3 install aiomysql
ps.这边写了一些基本的逻辑处理,但是写的有点鱼龙混杂,适合新手小伙伴们看看,还是看的懂滴~至于什么service层impl层mapper层啥的,不要这么讲究啦,大佬们可以指点一二自行封装~
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值