前言
本章应该是SQLAlchemy使用系列的最后一篇了,本章简单讲一下如何搭配Flask使用.下一篇应该是写Flask_restful相关内容了
正文
我们简单使用前两章的model,两张表
# -*- coding=utf-8 -*- from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, relationship, backref from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, String, Integer, ForeignKey # 用户名:密码@访问地址:端口/数据库?编码方式
engine = create_engine('mysql+mysqldb://root:***@***:***/website?charset=utf8mb4')
# 创建DBSession类型 DBSession = sessionmaker(bind=engine) # 创建Base基类 Base = declarative_base() class AdminUser(Base): # 超级用户表 __tablename__ = 'admin_user' # 表名 id = Column(Integer, primary_key=True) # 主键 username = Column(String(12), nullable=False, index=True, unique=True) # 用户名,Varchar12位,不可为空,常规索引 pwd = Column(String(256), nullable=False) # 密码,不可为空 token = Column(String(256)) # token class VIP(Base): # VIP用户 __tablename__ = 'VIP' # 表名 id = Column(Integer, primary_key=True) # id name = Column(String(12), nullable=False, index=True, unique=True) # name pwd = Column(String(25), nullable=False) # pwd money = Column(Integer, nullable=True) # 金币 status = Column(Integer, nullable=False) # 账号状态(1:正常,0:封禁,2:审核) class VIPInfo(Base): # VIP信息 __tablename__ = 'VIP_info' # 表名 id = Column(Integer, primary_key=True) # id info = Column(String(256)) # 备注 VIP_id = Column(Integer, ForeignKey('VIP.id'), unique=True, index=True) # 关联外键VIP.id(多对一) VIP = relationship('VIP', backref=backref('VIPInfo', uselist=False)) # 设置关联使VIPInfo能查询到VIP
*按上图逻辑,从VIPInfo查询VIP使用 .VIP(relationship第一个值), 从VIP查询到VIPInfo使用 .VIPInfo(backref值) / .join的形式是全连接查询,因此如果附表无值会查找不到,这种情况下使用 .outerjoin(左连接) 查询即可
然后我们在 main 内先引入 model
from app.website.models import VIP, VIPInfo, DBSession // DBSession必须引入,然后是用到的各个model
当然 Flask 的相关组件也要引入,这里不再赘述
简单做一个函数,返回
@website.route('/website/login', methods=['GET', 'POST']) def login(): if request.method == 'GET': session = DBSession() # 生成会话 id = request.args.get('id') # 用户id info = session.query(VIP).join(VIPInfo).filter(VIP.id==id).first() # 取用户id对应的信息,first是取第0个,同[0] dic = {} dic['VIP_info'] = info.VIPInfo.info # 注意,这里的.vipInfo就是model中的relationship一栏的backref参数1 dic['money'] = info.money return json.dumps(dic, ensure_ascii=False)
测试