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

SQLAlchemy

  • flask-sqlalchemy 如何进行配置

    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://用户名:密码@主机地址:端口号/数据库名?charset=utf8"
    
  • 常见的字段类型有哪些?

    String/Integer/DateTime/DECIMAL/Text
    
  • 数据添加

    # 单条数据添加
    user_obj = UserModel(字段名=)
    db.session.add(user_obj)
    db.session.commit()
    
    # 批量数据添加
    u1 = UserModel(字段名=)
    u2 = UserModel(字段名=)
    u3 = UserModel(字段名=)
    u4 = UserModel(字段名=)
    db.session.add_all([u1,u2,u3,u4])
    db.session.commit()
    
  • 数据查询

    # 查询所有
    UserModel.query.all()
    # 查询单条数据
    UserModel.query.first()
    # 查询name=majiahui
    UserModel.query.filter_by(name="majiahui").first()
    # 查询姓周的同学都有谁?
    UserModel.query.filter(UserModel.name.like("{}%".format(name))).all()
    # 查询 带有 晴 字的同学都有谁?
    UserModel.query.filter(UserModel.name.contains("晴")).all()
    #对所有的数据id进行降序排序
    UserModel.query.order_by(UserModel.id.desc()).all()
    #对所有的数据id进行升序排序
    UserModel.query.order_by(UserModel.id.asc()).all()
    # 获取数据的总数
    UserModel.query.count()
    # 分页
    UserModel.query.limit(页大小).offset(偏移量).all()
    
  • 数据编辑

    # 第一种
    UserModel.query.update({"name":"mayekang"})
    db.session.commit()
    # 第二种
    userobj = UserModel.query.filter_by(id=id).first()
    userobj.name = "xxxx"
    db.session.add(user_obj)
    db.session.commit()
    
  • 数据删除

    UserModel.query.filter_by(id=id).filter_by(age=12).delete()
    
二、单表数据查询补充
  • or_ , and_ , in_ 查询

  • select * from user where name=‘xx’ and age=17;

    from sqlalchemy import or_, and_
    task_filter = {
      or_(
       and_(
        Task.task_department == current_user.user_department,
        Task.task_commit_status > 0,
        Task.task_complete_time >= prev,
       ),
       and_(
        Task.task_complete_time >= prev,
        Task.task_members.like('%,'+str(current_user.user_id)+',%'),
       )
     )
    }
    Task.query.filter(*task_filter).all()
    
  • 比较查询 < >

    session.query(Task).filter(Task.task_complete_time == prev).all()
    
  • 聚合查询 func

    • 求总数

      User.query.filter_by(role_id=3,username='susan').count()
      
    • 求和(sum)

      from sqlalchemy.orm import func
      
      User.query.with_entities(func.sum(User.id)).all()
      
      session.query(func.sum(Staff.id)).scalar()
      
    • 平均数

      User.query.with_entities(func.avg(User.role_id)).all()
      
    • 去重 select distinct name from user;

      Staff.query.with_entities(Staff.name).distinct().all()
      
迁移与映射
  • flask-script 和 flask-migrate

    django : python manage.py makemigrations / 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()
    
    
  • 启动的迁移命令

    • python manage.py db init
    • python manage.py db migrate
    • python manage.py db upgrade
一对多关系

一对多关系是关系数据库中两个表之间的一种关系,该关系中第一个表中的单个行可以与第二个表中的一个或多个行相关,但第二个表中的一个行只可以与第一个表中的一个行相关。

  • 如图所示

在这里插入图片描述

  • 举例今日头条

在这里插入图片描述

  • 设计表结构

    tag 标签字段有 id name state create_time

    content 标签有 id name desc img state create_time

    class Nav(db.Model):
        __tablename__ = 'nav'
    
        id = Column(Integer, autoincrement=True, primary_key=True)
        name = Column(String(32), unique=True)
        state = Column(SmallInteger, default=0)
        create_time = Column(DateTime)
        # 如果有需要就绑定 否则可以不写,写在哪测都可以
        db.relationship("Content",backref="contents")
    
    class Content(db.Model):
        __tablename__ = 'content'
    
        id = Column(Integer, autoincrement=True, primary_key=True)
        name = Column(String(32), unique=True)
        state = Column(SmallInteger, default=0)
        create_time = Column(DateTime)
        # 外键
        nav_id = Column(Integer, ForeignKey("nav.id"))
    
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值