Flask_从入门到放弃?不!!!从入门到入土2!!!

SQLAlchemy

回顾

  • 蓝图怎么使用?

    # 导包
    from flask import Blueprint
    # 实例化
    bp = Blueprint("蓝图的名称",__name__)
    
    # 实现路由
    @bp.route("/")
    def index():
        return "ok"
    
    # 挂载app上
    app.register_blueprint(bp)
    
    # 启动
    app.run()
    
  • flask-restful 的安装

    pip install flask-restful
    
  • flask-restful 接收参数

    # 导包
    from flask_restful import Api,reqparse, Resource
    # 编写视图类
    class IndexView(Resource):
        # 约束字段类型
        parser = reqparse.RequestParser()
        parser.add_argument("验证的参数名称",help="提示信息",type=str,location="args",required=True)
        
        def get(self):
            # 获取参数
            params = self.parser.parse_args()
            # 获取其中的数据
            name = params.get("name")
            
            return "ok"
    
  • 视图类的装饰器的使用

    # 导包
    from flask_restful import Api,reqparse, Resource
    # 编写视图类
    class IndexView(Resource):
        # methods_decorators = [装饰器1,装饰器2]
        method_decorators = {
            "get": [装饰器1,装饰器2]
        }
        # 约束字段类型
        parser = reqparse.RequestParser()
        parser.add_argument("验证的参数名称",help="提示信息",type=str,location="args",required=True)
        
        def get(self):
            # 获取参数
            params = self.parser.parse_args()
            # 获取其中的数据
            name = params.get("name")
            
            return "ok"
    
  • 如何进行 flask-restful 序列化输出

    # 导包
    from flask_restful import fileds, marshal_with, marshal
    
    # 指定序列化的键
    fields_resource = {
        "key": fields.String
    }
    
    # 
    class IndexView(Resource):
        # 约束字段类型
        parser = reqparse.RequestParser()
        parser.add_argument("验证的参数名称",help="提示信息",type=str,location="args",required=True)
        @marshal_with(fields_resource)
        def get(self):
            # 获取参数
            params = self.parser.parse_args()
            # 获取其中的数据
            name = params.get("name")
            
            return marshal("需要序列化的值",fields_resource)
    
二、ORM与Flask-SQLAlchemy扩展
  • 什么是 orm ?

    ORM的全称是:Object Relational Mapping (对象 关系 映射)
    简单的说,orm是通过使用描述对象和数据之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

    ORM需要解决的问题是,能否把对象的数据直接保存到数据库中,又能否直接从数据库中拿到一个对象?要想做到上面两点,则必须要有映射关系。

    模型类 《----》 表

    属性 《----》 字段

    对象 《----》 记录

  • orm的优势与劣势

    • 优势

      orm的技术特点,提高了开发效率。可以自动对实体Entity对象与数据库中的Table进行字段与属性的映射;不用直接SQL编码,能够像操作对象一样从数据库中获取数据

    • 劣势

      orm会牺牲程序的执行效率和会固定思维模式,在从系统结构上来看,采用orm的系统多是多层系统的,系统的层次太多,效率就会降低,orm是一种完全面向对象的做法,所以面向对象的做法也会对性能产生一定的影响。

  • flask 如何使用 orm ?

    pip install flask-sqlalchemy
    
  • 如何配置数据库?

    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://用户名:密码@ip:端口/数据库名称?charset=utf8"
    
  • 如何创建数据模型(常用的字段)

    字段描述备注
    Integer整型int
    String字符串varchar
    SmallInteger整型smallint
    DateTime时间类型datetime
    Text文本类型text
    DECIMAL数据库存储的精确数值decimal
  • 如何创建一张表

    class UserModel(db.Model):
    
        __tablename__ = "user"
    
        id = Column(Integer, autoincrement=True, primary_key=True)
    
        username = Column(String(32), unique=True, default="")
    
        pasword = Column(String(255), default="", nullable=True)
    
        state = Column(SmallInteger, default=0, index=True)
    
        create_time = Column(DateTime, default=datetime.now())
    
  • 注意事项

    • 创建表的时候 需要给字段指定主键
  • 如何完成数据迁移

    • flask-script

      flask-script : 执行脚本命令的插件

      pip install flask-script
      
      # 导入 Flask-Script 中的 Manager
      from flask_script import Manager
      # 让app支持 Manager
      manager = Manager(app)
      
      if __name__ == '__main__':
          #app.run()
          # 替换原有的app.run(),然后大功告成了
          manager.run()
      
    • flask-migrate

      flask-migrate: 进行数据库的迁移与映射

      pip install flask-migrate
      
    • 代码示例

      from flask_script import Manager
      from flask_migrate import Migrate, MigrateCommand
      from main import app
      from models import db
      
      # 将脚本注册到app上
      manage = Manager(app)
      # 实例化迁移
      migrate = Migrate(app,db)
      # 在脚本上添加迁移命令
      manage.add_command("db",MigrateCommand)
      
      if __name__ == '__main__':
          manage.run()
      
      
三、单表操作
  • 数据库事务

    # 事务提交
    db.session.commit()
    # 事务回滚
    db.session.rollback()
    
  • 新增数据

    # 单条数据添加
    u1 = UserModel(username="sxr")
    db.session.add(u1)
    db.session.commit()
    
    
    # 批量添加
    u1 = UserModel(username="bikuicheng")
    u2 = UserModel(username="waghaiyuan")
    u3 = UserModel(username="renyu")
    u4 = UserModel(username="dongdeqian")
    
    db.session.add_all([u1,u2,u3,u4])
    db.session.commit()
    
  • 查询数据

    # 读取所有数据
        # u1 = UserModel.query.all()
        # data_list = [{
        #     "id": i.id,
        #     "username": i.username,
        # } for i in u1]
        #
        # # 返回值
        # ret = {
        #     "data": data_list
        # }
    
        # 只显示一条数据
        # u1 = UserModel.query.first()
        # print(u1.username)
    
        # 排序 order by id desc  asc升序/desc降序
        # u1 = UserModel.query.order_by(UserModel.id.desc()).first()
        # u1 = UserModel.query.order_by(UserModel.id.asc()).all()
    
        # 精确检索条件
        # select * from user where username = "shixiaoru";
        # u1 = UserModel.query.filter_by(username="shixiaoru").first()
        # u1 = UserModel.query.filter(UserModel.username=="shixiaoru").first()
    
        # 模糊搜索 select * from user where username like "%li%";
        # u1 = UserModel.query.filter(UserModel.username.like("%{}%".format("li"))).all()
        # u1 = UserModel.query.filter(UserModel.username.contains("li")).all()
        # data_list = [{"username": i.username} for i in u1]
    
        # orm执行sql语句  group by xxx having ss
        # sql = "select id,username from user where id > 14;"
        # data = db.session.execute(sql)
        # data_list = []
        # for i in data:
        #     data_list.append({
        #         "id": i[0],
        #         "username": i[1]
        #     })
        # 1 0-10   2 11-20  3 21-30
        # 分页 select * from user limit 0,10;
        # select * from user limit 参数1,参数2;
        # 参数1 起始的位置   参数2 相当于偏移量
        # total  总条数  data 当前页的数据
        # 获取当前页
        p = int(request.args.get("page")) if request.args.get("page") else 1
        # 页大小
        pagesize = int(request.args.get("pagesize")) if request.args.get("pagesize") else 10
        # 偏移量
        offset = (p-1) * pagesize
        # 计算数据的总条数
        total = UserModel.query.count()
        # 当前页的数据  链式调用 惰性查找
        data = UserModel.query.order_by(UserModel.id.asc()).limit(pagesize).offset(offset).all()
    
        data_list = [{
            "id":i.id,
            "username": i.username
        } for i in data]
    
        #返回
        ret = {
            "total": total,
            "data": data_list
        }
    
  • 编辑数据

    # 第一种方式
    user_model = UserModel.query.filter_by(id=1).first()
    user_model.username = "xxxxx"
    db.session.add(user_model)
    
    # 第二种
    flag = UserModel.query.filter_by(id=1).update({"username":"yyyy"})
    db.session.commit()
    
  • 删除数据

    UserModel.query.filter_by(id=1).delete()
    db.session.commit()
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值