[ Flask数据库增删改查 ]


目录:

一.数据库查询

pip install flask-sqlalchemy
pip install mysqlclient

1. 主要文件结构

extention.py

  • 实例化sqlalchemy连接数据库模块
  • 和迁移模块
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

db: SQLAlchemy = SQLAlchemy()
migrate = Migrate()

models.py

  • 多对多关系梳理:
    • 中间表名db.Table
    • 字段id, 表1外键, 表2外键

用户表UserModel <<--多对多-->> 关联权限表RoleModel roles = db.relationship( - RoleModel, # 填写正向查询的用的表名 - secondary=user_role, # secondary 中间表名 - backref=db.backref('users'), # 提供对方反向查询(填写自己表名) - lazy='dynamic') lazy = 'dynamic'积极查询, 当用户查询执行user.roles就会执行查询语句 正常情况下不配置lazy默认 需要执行user.roles.all()等查询方法才会进行数据库查询

from extention import db

# 用户 & 角色 
user_role = db.Table(
    "user_to_role",  # 表名
    db.Column('id', db.Integer, primary_key=True, comment='标识id'),
    db.Column('user_id', db.Integer, db.ForeignKey('tb_user.id'), comment='用户编号'),
    db.Column('role_id', db.Integer, db.ForeignKey('tb_role.id'), comment='角色编号')
)

# 角色 & 权限
role_power = db.Table(
    "role_to_power",
    db.Column('id', db.Integer, primary_key=True, autoincrement=True, comment='标识'),
    db.Column('power_id', db.Integer, db.ForeignKey('tb_power.id'), comment='用户编号'),
    db.Column('role_id', db.Integer, db.ForeignKey('tb_role.id'), comment='角色编号')
)


# 用户
'''
用户 ---> 权限
'''
class UserModel(db.Model):
    __tablename__ = 'tb_user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment = '用户id')
    username = db.Column(db.String(64), unique=True, nullable=False)
    password = db.Column(db.String(64))
    roles = db.relationship('RoleModel',
                           secondary=user_role,         # secondary 中间表名
                           backref=db.backref('users'), # 反向查询
                           lazy='dynamic')              # 正向懒惰查询 直接点方法不会执行查询, 需要.all()

# 角色
class RoleModel(db.Model):
    __tablename__ = 'tb_role'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True, comment='角色唯一名称')
    code = db.Column(db.String(64), unique=True, comment='角色唯一标识')
    powers = db.relationship('PowerModel',
                             secondary=role_power,
                            backref=db.backref('roles'))


# 权限
class PowerModel(db.Model):
    __tablename__ = 'tb_power'
    id = db.Column(db.Integer, primary_key=True)
    url = db.Column(db.String(64), unique=True, comment='权限路径')
    code = db.Column(db.String(64), comment='权限标识')

    # 自关联
    parent_id = db.Column(db.Integer, db.ForeignKey('tb_power.id'), comment='父类编号')
    parent = db.relationship('PowerModel', remote_side=[id]) # 自关联

utils.py 其他工具

保存权限字典信息

permission = {
    'read': '/auth/read',
    'commit': '/auth/comment',
    'write': '/auth/write',
    'admin': '/admin'
}

app.py主入口文件

from flask import Flask, request, redirect, url_for
from flask import render_template, session
# from auth_decorator import permission_required, login_required, rolu_required, admin_required
from utils import permission
from extention import migrate
from extention import db
from models import UserModel, PowerModel, RoleModel
# from models import UserModel, RoleModel

class Config:
    SQLALCHEMY_DATABASE_URI = 'mysql://chf:123456@192.168.50.213:3306/flask'
    SQLALCHEMY_TRACK_MODIFICATIONS = False


app = Flask(__name__, template_folder='templates', static_folder='static')
app.secret_key = '1234576'
app.config.from_object(Config)

# 初始化模型
db.init_app(app)

# 生成迁移文件
migrate.init_app(app, db)


# 首页
@app.route('/')
def index():
    return render_template('index.html')


@app.cli.command()
def create():
    # db.drop_all()
    # db.create_all()

    # user1 = UserModel(username='chf', password='456')
    # user2 = UserModel(username='ozj', password='123')
    # db.session.add(user1)
    # db.session.add(user2)
    # db.session.commit()
    # roles = [
    #     {'name': '普通用户', 'code': 'level1'},
    #     {'name': '会员用户', 'code': 'level2'},
    #     {'name': '管理员用户', 'code': 'level3'},
    # ]

    # role1= RoleModel(name=roles[0]['name'], code= roles[0]['code'])
    # role2= RoleModel(name=roles[1]['name'], code= roles[1]['code'])
    # role3= RoleModel(name=roles[2]['name'], code= roles[2]['code'])
    # db.session.add_all([role1, role2, role3])
    # db.session.commit()

    # _permission = {
    #     'read': '/auth/read',
    #     'commit': '/auth/commit',
    #     'write': '/auth/write',
    #     'admin': '/admin'
    # }

    # power1 = PowerModel(url=_permission['read'], code='read')
    # power2 = PowerModel(url=_permission['commit'], code='commit')
    # power3 = PowerModel(url=_permission['write'], code='write')
    # power3 = PowerModel(url=_permission['admin'], code='admin')

    # db.session.add_all([power1, power2, power3])
    # db.session.commit()
    users = UserModel.query.all()
    roles = RoleModel.query.all()
    powers = PowerModel.query.all()

    # print(users)
    # print(roles)
    # print(powers)
    # # 给<1角色>添加<权限>
    # roles[0].powers.append(powers[0])     # 读
    # roles[1].powers.append(powers[1])     # 提交

    # # 给<2角色>添加<权限>
    # roles[2].powers.append(powers[0])     # 读
    # roles[2].powers.append(powers[1])     # 提交
    # roles[2].powers.append(powers[2])     # 写

    # # 给<用户>添加<角色>
    # users[0].roles.append(roles[0])       # chf -> 普通用户   -> 读, 提交
    # users[1].roles.append(roles[1])       # chf -> 管理员     -> 读, 提交, 写

    # 用户 --> 角色 --> 角色 --> 权限密码

    # db.session.commit()
    role = users[0].roles.all()
    print(role)
    powers = role[0].powers
    print(powers)
# # 注册
# @app.route('/register', methods=['GET', 'POST'])
# def register():
#     if request.method == 'POST':
#         username = request.json.get('username')
#         password = request.json.get('passowrd')
#         print(username,password)
#         user = UserModel()
#         user.username = username
#         user.password = password
#         db.session.add(user)
#         user.role.append(RoleModel.query.get(1))
#         db.session.commit()
#         return {'status': 'success', 'message': '成功注册, 接下来可以去登录', 'next': '/login'}
#     return render_template('register.html')


# # 登录
# @app.route('/login', methods=['GET', 'POST'])
# def login():
#     if request.method == 'POST':
#         username = request.json.get('username')
#         password = request.json.get('password')
#         user = UserModel.query.filter(UserModel.username=username).first()
#         session['_user_id'] = user.id
#         session['permission'] =  ':'.join([power.code for role in user.role for power in role.power])
#         return {'statuc': 'success', 'next': './home', 'message': '登录成功'}
#     return render_template('login.html')


# # 退出登录
# @app.route('/logout')
# def logout():
#     session['_user_id'] = ''
#     session['permission'] = ''
#     return redirect('/')


# # home
# @app.route('/home')
# @login_required
# def home():
#     return render_template('home.html')

if __name__ == '__main__':
    app.run()

启动命令

# 1. 进入到flask的项目文件下面,  app.py文件同级, 终端运行项目
flask run

# 2. 终端执行迁移, 和运行指定函数初始化
flask create #相当于执行app.py文件里的create函数