flask-模型

flask模型

  1. 准备工作

    1. 安装包

      pip install pymysql				#python与数据库连接需要的包
      pip install flask-sqlalchemy	#ORM映射
      pip install flask-script		#使用该包来进行命令的管理使用
      pip install flask-migrate		#该包实现模型与数据库的迁移工作
      
      
    2. 配置包

      #exts/__init__.py:
      db = SQLAlchemy()
      
      
      #app.py:
      app = create_app() 				
      #通过工厂fun来创建app
      manager = Manager(app=app)		
      #通过实例化Manager来封装app
      migrate = Migrate(app=app, db=db)
      manager.add_command('db', MigrateCommand)
      #上述两个命令可以把数据库与manager进行绑定,并向其添加db的命令,该命令本质是MigrateCommand
      if __name__ == '__main__':
          manager.run()
      #通过在app.py文件中进行以上的配置,我们的app就封装完毕了
      
      
      #terminal:
      #使用的方式是
      python app.py runserver [-h 0.0.0.0 -p 5000]
      python app.py 		#会提示可以使用的命令
      
  2. 使用数据库

  3. 需要在响应的包下创建models.py文件,文件中的内容为

      ```python
      from exts import db
    


    ​ class User(db.Model):
    tablename = ‘user’
    ​ id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    ​ username = db.Column(db.String(64), nullable=False)

    def str(self):
    return self.username

      #可选的数据类型有
      '''
      Interger, 
      String(size) size是必须要指定的项目,
      Text 长文本型,
      DateTime,
      Boolean 0为False别的为True,
      PickleType,
      LargeBinary
      '''
      #可选的参数值有
      '''
      primary_key = True, 
      autoincrement = True, 
      nullable = False, 
      unique = True, 
      default = datetime.now, 默认值,像这样写可以自动存入当前时间
    '''
    
    
    
  4. 进行数据库与模型的对映和迁移

      ```python
      #app.py:
      from models import User
      #必须要在app文件中将模型导入,否则要报错
      
      #terminal:
      python app.py db init		#仅执行一次,创建migrations包
      python app.py db migrate	#迁移
      python app.py db upgrade    #同步数据库为当前迁移
    
    
    
  5. 数据库的增删改查

      ```python
      #增
      user = User()
      user.username = '张三'
      user.age = 18
      db.session.add(user)
      db.session.commit()
      #查
      .first()					#得到查出来数据的第一个,建议在所有的查询方法后边加first或all,可以避免打印出查询语句
      User.query.all()			#得所有得数据,结果是列表
      User.query.get(pk)			#pk可以str/int
      User.query.filter_by(字段名 = value)
      User.query.filter(模型名.字段名 == value)
      User.query.filter(模型名.字段名.endswith('z')).all()
      User.query.filter(模型名.字段名.startswith('z')).all()
      User.query.filter(模型名.字段名.contains('z')).all()
      User.query.filter(模型名.字段名.like('%z%')).all()
      User.query.filter(模型名.字段名.in_([])).all()
      User.query.filter(模型名.字段名.__lt__(18).all()
      User.query.filter(模型名.字段名.__le__(18).all()
      User.query.filter(模型名.字段名.__gt__(18).all()
      User.query.filter(模型名.字段名.__ge__(18).all()
      User.query.filter(模型名.字段名.between(18, 50).all()
      User.query.filter(User.rtime.__le__(datetime))
      User.query.filter(or_())
      User.query.filter(and_())    #and_是默认,可以不写
      User.query.filter(not_())
      User.query.order_by('')	
      User.query.order_by(-User.id)		#只有是字段的时候才能-代表从大到小,也能是字符串如age
      User.query.filter().limit(2).all()  #只获取前两条数据   
      User.query.filter().offset(2).limit(2).all()  #跳过前两条数据取两条   
      #上述的查询是可以进行连用的,建议最后加.first()或.all(),避免得不到预期结果
                        
      #删
      user = User.query.get(1)
      user.isdelete = True		#逻辑删除
      db.session.commit()			#提交
      db.session.delete(user)		#物理删除
      db.session.commit()			#提交
      #改
      user = User.query.get(1)
      user.username = 'new'		#更新字段值
      user.age = 20					
      db.session.commit()			#提交
    
    
    
  6. 提高

      ```python
      #数据库可以将共通的键进行抽象
      class BaseModel(db.Model):
          __abstract__ = True       #该项定义此model是抽象模型
          id = db.Column(db.Integer, primary_key=True, autoincrement=True)
          username = db.Column(db.String(64), nullable=False)
          
      #通过继承BaseModel来复用    
      class User(BaseModel):
          age = db.Column(db.Integer)
          gender = db.Column(db.String(4))
          def __str__(self):
              return self.username
    
    
    
  7. 多表

    1. 一对多

      #User
      class User(db.Model):
          id = db.Column(db.Integer, primary_key=True, autoincrement=True)
          username = db.Column(db.String(15), nullable=False)
          password = db.Column(db.String(64), nullable=False)
          articles = db.relationship('Article', backref='user')
          
      #Article
      class Article(db.Model):
          id = db.Column(db.Integer, primary_key=True, autoincrement=True)
          title = db.Column(db.String(50), nullable=False)
          user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
      
    2. 多对多

      class Page(db.Model):
          id = db.Column(db.Integer, primary_key=True)
          tags = db.relationship('Tag', secondary='Page_tag', backref='page')
      
      class Tag(db.Model):
          id = db.Column(db.Integer, primary_key=True)
          name = db.Column(db.String(20),nullable=False)
          
      class Page_tag(db.Model):
          id = db.Column(db.Integer, primary_key=True)
          p_id = db.Column(db.Interger, db.ForeignKey('page.id'))
          t_id = db.Column(db.Interger, db.ForeignKey('Tag.id'))
      
  8. 分页器

    pagination = User.query.paginate(page, per_page)
    pagination.items			#每个取到的user
    pagination.page				#当前页码
    pagination.prev_num			#上页码
    pagination.next_num			#下页码
    pagination.has_next			#是否有下
    pagination.has_prev			#是否有上
    pagination.pages			#总页数
    pagination.total			#总数据数
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值