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()