flask框架3(数据库ORM)

  • ORM
    • 对象关系映射,主要实现模型对象到关系数据库数据的映射
    • 优势:面向对象编程,对数据库的操做都转化成对类属性和方法的操做,不用编写各类数据库的sql语句
    • 数据模型与数据库的解耦,不在关注用的是mysql、oracle...等,经过简单的配置就能够轻松更换数据库, 而不须要修改代码
    • 缺点是会有性能损失
  • Flask-SQLAlchemy
    • 安装,这里连接mysql:
      • pip install flask-sqlalchemy
      • pip install flask-mysqldb 若是安装报错使用sudo apt-get install python3.5-dev
    • 配置:
      • 必要的连接配置 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://用户名:密码@127.0.0.1:3306/要链接的数据库名'
      • 其余配置
        • 动态追踪修改设置,如未设置只会提示警告 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
        • 查询时会显示原始SQL语句 app.config['SQLALCHEMY_ECHO'] = True
  • 使用
db = SQLAlchemy(app)
class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    name = db.Column(db.String(50),nullable=False)
    age = db.Column(db.Integer)
  • 增删查改
    • 表增删
      • db.drop_all()
      • db.create_all()
    • 插入一条数据
      • data1 = User(name='xxx',age=11)
      • db.session.add(data1)
      • db.session.commit()
    • 插入多条
      • db.session.add_all([列表])
      • db.session.commit()
    • 查询
      • User.query.get(1) 返回指定主键对应的行,如不存在,返回None
      • User.query.all() 以列表形式返回查询的全部结果
      • User.query.first() 查询第一个
      • User.query.count() 返回查询结果的数量
      • User.query.filter_by(name='xxx').all() 返回名字等于xxx的全部人
      • User.query.filter(User.name=='xxx').first() 返回名字等于xxx的第一我的,使用filter必须指明熟悉来自哪一个类,且用==链接
      • User.query.filter(User.name.endswith('x')).all() 返回名字结尾字符为x的全部数据 (开始startswith/包含contains)
      • User.query.filter(User.name.startswith('x'), User.age.startswith('2')).all() 查询名字x开头和年龄2开头的全部人
        另一种写法:User.query.filter(and_(User.name.startswith('x'), User.age.startswith('2'))).all()
      • 使用and_ not_ or_必需要导入 from sqlalchemy import and_,not_,or_
        • and_(1,2) 1和2两个条件都成立
        • or_(1,2) 1或者二任一成立
        • not_() 取反
      • User.query.filter(User.id.in_([1,3,5,7,9])).all() 查询id为 [1, 3, 5, 7, 9] 的全部数据 包含:in_([])
      • User.query.order_by(User.age.desc()).all() 按年龄排序 desc:降序 aesc: 升序
      • 分页:pag = User.query.paginate(2, 3) 将全部数据分页,查询第二页的数据,每页三条
      • pag.items 获取当前页码的全部数据
      • pag.page 获取当前页码
      • pag.pages 获取总页数
  • 数据库迁移
    • 须要使用第三方包flask_script和flask_migrate from flask_script import Manager from flask_migrate import Migrate,MigrateCommand
    • 迁移代码配置:
      • 1.配置数据库及建立flask和数据库对象
      • 2.建立迁移对象 migrate = Migrate(app,db) 这里传入flask对象和数据库对象
      • 3.建立管理对象 manager = Manager(app) 使用flask_script的Manager管理app
      • 4.添加迁移命令到管理对象 manager.add_command('add_db',MigrateCommand) 使add_db做为命令行的迁移命令使用
      • 5.使用manager.run()运行程序
    • 迁移步骤:
      • 1.初始化迁移操做:进入命令行,输入python3 py文件名.py add_db init
      • 2.建立迁移脚本并记录当前版本号:输入python3 py文件名.py add_db migrate -m '此处输入版本标记,注释'
      • 3.更新数据库,迁移确认:输入python3 py文件名.py add_db upgrade
    • 注意只须要第一次迁移时须要初始化操做,后续若是有修改直接操做2,3步便可
    • 若是要回滚版本,可使用python3 py文件名.py add_db history命令查看历史版本号
    • 回滚版本使用命令python3 py文件名.py add_db downgrade 版本号
相关文章
相关标签/搜索