目录
前言
手册目录:
软件下载及环境安装:
实习手册一(基于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中,实现用户的注册功能。