• SQLAlchemy使用(三)搭配Flask框架使用


    前言

    本章应该是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)

    测试

  • 相关阅读:
    ScottGu: 宣布微软 AJAX CDN
    表格数据流协议TDS
    .NET 4 System.Threading.Barrier 类
    企业架构思考
    OpenSSL的托管项目
    WCF服务中操作FormsAuthentication的Cookie
    Silverlight相关博客收集20090927
    Sync Framework 2.0
    [中央电视台·见证]大学堂——兰州大学
    系统进程管理工具Process Explorer
  • 原文地址:https://www.cnblogs.com/chnmig/p/10469757.html
Copyright © 2020-2023  润新知