公众号:uncle39py

V1

2022/02/08阅读:27主题:默认主题

flask-sqlachemy

flask-sqlachemy

flask-sqlachemysqlachemy做了一层封装,底层还是sqlachemy的东西;

建议对照着sqlachemy来学每一个知识点

以下将flask-sqlachemy不同之处列举出来,顺带复习下sqlachemy;

1.配置

# 请对照sqlachemy篇查看
# 配置的变量名是固定的,flask-sqlachemy框架会从app的config中去提取这些变量的值
class Config():
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:root@127.0.0.1:3306/test?charset=utf8'  # sqlachemy中引擎的值
    SQLALCHEMY_POOL_SIZE = 5
    SQLALCHEMY_POOL_TIMEOUT = 30
    SQLALCHEMY_POOL_RECYCLE = -1

    # 设置sqlalchemy自动跟踪数据库的修改
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    
    # 增删改查打印出SQL语句
    SQLALCHEMY_ECHO = True

2.得db得天下

所有sqlachemy中常用的东西,都从db中取;记住db哪里来db = SQLAlchemy(app)

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import Config

app = Flask(__name__)
app.config.from_object(Config)

db = SQLAlchemy(app)  #从app中读取参数,实例化db对象

3.模型类

以下使用去对比下sqlachemy的模型类

from . import db #导入上面生成的db对象

#一对多:一个用户只拥有一个角色,一个角色下可以有多个用户;外键写在多的一方
class Users(db.Model):
    __tablename__ = 'tbl_users'
    id = db.Column(db.Integer,primary_key=True)  # 整型的主键,默认是自增主键
    name = db.Column(db.String(32),unique=True)
    email = db.Column(db.String(32),unique=True)
    password = db.Column(db.String(32))
    role_id = db.Column(db.Integer,db.ForeignKey('tbl_role.id')) #从数据库表的层面考虑
    role = db.relationship('Role',backref='users')
    # 从模型类的层面考虑,users是给Role反向查询使用的:Role.users;程序底层肯定是通过外键来实现的

class Role(db.Model):
    __tablename__ = 'tbl_role'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32),unique=True)
    
if __name__ == '__main__':
    # db.drop_all() #删除数据库中被db接管的所有表
    db.create_all() #建"被db接管"的所有表

4.增删改查

此处仅需记住一条:session是从db中取:db.session ;db.session是处理了线程安全的

session:会话;你当前做了哪些动作你要告诉我下,我记录一下统一提交(db.session.commit())

flask-sqlachemy对sqlachemy做了一层封装,增删改操作都一样,查询操作有两种方式:

  • 方式一:使用sqlachemy提供的方法
  • 方式二:使用flask-sqlachemy提供的方法

两种查询方式的区别:

res = db.session.query(Role).filter_by(name='admin').all()

res = Role.query.filter_by(name='admin').all()

即开头处db.session.query(Role)Role.query的区别,为方便统一记忆只记sqlachemy提供的方法

res = Users.query.filter(Users.name.endswith('g')).all()
res = db.session.query(Role).offset(1).limit(1).all() #第几条开始取,取几条;offset是偏移的意思,即跳过1条

#取数据最终都要加上all()或first():要么取所有,要么取单条
#插播1:分组就是归类,对一堆数据按照某一个属性归了归类,然后看看这几类的整体属性对比
#插播2:用sql删除和修改时,先写查询语句,用于测试条件是否正确,然后在改写成删除和修改

分类:

后端

标签:

Python

作者介绍

公众号:uncle39py
V1