实习手册五(Python基于Tornado框架的接口响应服务)SqlAlchemy的再封装,PyMySQL和SqlAlchemy的结合使用

目录

前言

通过PyMySQL对SqlAlchemy进行再封装


前言

手册目录:

软件下载及环境安装:

实习手册一(基于Tornado框架的接口响应服务)软件下载与环境配置

Tornado基本框架搭建:

实习手册二(基于Tornado框架的接口响应服务)Tornado基本框架的搭建

Tornado框架中日志的记录,路由的分发,接口的响应:

实习手册三(基于Tornado框架的接口响应服务)Tornado框架中日志的记录,路由的分发,接口的响应

通过PyMySQL,SQLAlchemy在tornado服务中实现对数据的增删改查

实习手册四(基于Tornado框架的接口响应服务)通过PyMySQL,SQLAlchemy在tornado服务中实现对数据的增删改查

本章目标:通过PyMySQL对SqlAlchemy进行再封装

通过PyMySQL对SqlAlchemy进行再封装

为什么要对SqlAlchemy进行封装呢,它本身不就已经对sql语言进行了封装吗?

这里直接用代码来说明理由:

session = SqlAlBase.get_session()

# 新建一个User对象,用户名为apple,密码为654321,日期为2022/7/28
newUser = User(uname='apple', pwd='654321', create_time='2022/7/28')

# 使用session对象的add方法向表中添加新的用户
session.add(newUser)

# commit方法
session.commit()

这是我们上一章用以在user表中添加新数据的代码,试想一下,假如要往很多个表里添加数据,那不就是要不断的重复add和commit相关的代码,这样是非常繁琐且无聊的操作。

因此,我们要对SqlAlchemy进行再封装,使它更具有通用性。

那么,怎么将SqlAlchemy进行封装呢,我们就需要用到它的好朋友——pymysql了,话不多说,先上代码:

import pymysql
from sqlalchemy import create_engine, text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import MetaData
from sqlalchemy import Column, String, Integer

# URL用来作为SqlAlchemy创造引擎的url
# 格式为:"mysql+pymysql://root:你的mysql密码@localhost:3306/数据库名称"
URL = "mysql+pymysql://root:你的密码@localhost:3306/数据库名称"

# sqlalchemy是根据session对象来调用对应方法来对数据进行处理
class SqlAlBase():
    engine = create_engine(URL)
    base = declarative_base()
    session = sessionmaker(bind=engine)()
    metadata = MetaData()

    # 类方法,不需要创建SqlAlBase对象即可调用,get_session方法用来获取session对象
    @classmethod
    def get_session(cls):
        return cls.session

    # 类方法,用来获取base
    @classmethod
    def get_base(cls):
        return cls.base

class MysqlBase():
    session = SqlAlBase.get_session()
    conn = None
    @classmethod
    def TestConn(cls):
        if not cls.conn:
            cls.conn = pymysql.connect(user='root', host='localhost', password=你的密码, db=数据库名称, port=3306)
            print("trying to connect to '%s'" % cls.conn)

        else:
            print("already connected to '%s'" % cls.conn)
    
    # 添加方法
    @classmethod
    def add(cls, user):
        MysqlBase.TestConn()
        cls.session.add(user)
        cls.session.commit()
    
    #删除方法
    @classmethod
    def delete(cls, filter):
        cls.TestConn()
        cls.session.query(cls).filter(text(filter)).delete(synchronize_session=False)
        cls.session.commit()
    
    # 更新方法
    @classmethod
    def update(cls, filter, value):
        cls.TestConn()
        cls.session.query(cls).filter(text(filter)).update(value, synchronize_session=False)
        cls.session.commit()
    
    # 查询方法
    @classmethod
    def query(cls, filter, *columns):
        cls.TestConn()
        if not filter:
            item_list = cls.session.query(*columns or cls).all()
            return item_list
        else:
            item_list = cls.session.query(*columns or cls).filter(text(filter)).all()
            return item_list

# user表映射的数据模型
class User(SqlAlBase.get_base(), MysqlBase):          # 多继承,通过继承MysqlBase类,这样User类就可以自己调用数据库处理方法了
    __tablename__ = 'user'
    userid = Column(Integer, autoincrement=True, primary_key=True)
    uname = Column(String(255))
    pwd = Column(String(255))
    create_time = Column(String(255))

# 获取返回的对象列表
item_list = User.query(None, *[User.userid, User.uname, User.create_time])
for item in item_list:
    print(item)

其中,filter是过滤条件,相当于sql语句中的where部分。可以看到,只要我们的数据模型继承了MysqlBase的基类,就可以调用sqlalchemy中的数据处理方法了。

下一章我们会将其结合到Tornado中,实现用户的注册功能。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值