目錄
前言
通過PyMySQL對SqlAlchemy進行再封裝
手冊目錄:
軟件下載及環境安裝:
實習手冊一(基於Tornado框架的接口響應服務)軟件下載與環境配置
Tornado基本框架搭建:
實習手冊二(基於Tornado框架的接口響應服務)Tornado基本框架的搭建
Tornado框架中日志的記錄,路由的分發,接口的響應:
實習手冊三(基於Tornado框架的接口響應服務)Tornado框架中日志的記錄,路由的分發,接口的響應
通過PyMySQL,SQLAlchemy在tornado服務中實現對數據的增刪改查
實習手冊四(基於Tornado框架的接口響應服務)通過PyMySQL,SQLAlchemy在tornado服務中實現對數據的增刪改查
本章目標:通過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中,實現用戶的注冊功能。