Fork me on GitHub

Flask学习笔记(八)-Flask-Sqlalchemy基本使用详解

一、环境的安装

pip install flask-sqlalchemy
pip install pymysql

二、基本使用

1、最小型应用:

对于Flask 的应用来说,需要做的就是为 Flask 实例选择加载配置,然后把 SQLlchemy 实例传递给它即可:

示例展示:

flask_SQLalchemy

  ------ app.py

  ------ config.py

config.py

class Configs:
    ENV='development'
    DEBUG=True
    # 设置连接数据库路径
    SQLALCHEMY_DATABASE_URI='mysql+pymysql://root:root@xxx.116.152.57:3308/flask_test'
    # 每次请求结束后自动提交数据库中的改动
    SQLALCHEMY_COMMIT_ON_TEARDOWN=True
    # 禁用SQLAlchemy对追踪对象的修改并且发送信号
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    # 操作数据库时显示原始SQL语句
    SQLALCHEMY_ECHO=True

app.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import Configs
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = Configs.SQLALCHEMY_DATABASE_URI
db = SQLAlchemy(app)
db.init_app(app=app)

# 创建模型类
class User(db.Model):
    #设置表名
    __tablename__ = 'user'
    # 创建数据库表字段
    # db.Column(类型,约束)
    id=db.Column(db.Integer,primary_key=True,autoincrement=True)
    username=db.Column(db.String(15),nullable=False)
    email = db.Column(db.String(120), unique=True)
    def __init__(self,username,email):
        self.username=username
        self.email=email
    def __repr__(self):
        return '<User %s>' %self.username


if __name__ == '__main__':
    db.create_all()
    app.run(debug=True)

 首先,要让 Flask-SQLAlchemy 根据模型类创建数据库。db.create_all()函数将寻找所有db.Model的子类,然后在数据库中创建对应的表,如果数据库中相应表已存在,则db.create_all()不会重新创建或者更新相应的表。

2、Flask-SQLAlchemy增删改查

增:上面的代码中我们已经在 MySql 数据库中创建了一个表user,接下来我们添加几条数据到user表中
def add_test():
    """
    insert添加数据
    :return:
    """
    admin = User(username='admin', email='admin@example.com')
    guest = User(username='guest', email='guest@example.com')
    db.session.add(admin)
    db.session.add(guest)
    db.session.commit()

删:下面我们删除掉username=guest这条数据:

def delete_test():
    """
    删除数据
    :return:
    """
    guest = User.query.filter_by(username='guest').first()
    db.session.delete(guest)
    db.session.commit()

改:下面我们修改username=admin这条数据,让其邮箱变更为admin_xgh@qq.com:  

def update_test():
    """
    修改数据
    :return:
    """
    admin = User.query.get(1)
    admin.email = 'admin_xgh@qq.com'
    db.session.add(admin)
    db.session.commit()

查:下面我们访问这个表,看下数据是否已插入成功:

def select_test():
    """
    查询数据
    :return:
    """
    select_all=User.query.all()
    print(select_all)
    select_first= User.query.filter_by(username='admin').first()
    print(select_first)

三、建立项目模型(数据库表间关系简解)

在关系型数据中,表与表之间存在三种关系:

一对多:最常见的表间关系。假设现在有两张表:学生表student和班级表grade。student存储学生信息,grade存储班级信息。每个学生都对应一个班级,每个班级对应多个学生

一对一:只需为relationship添加参数uselist=False即可建立一对一关系

多对多:若要定义多对多关系,需要借助一张中间表进行实现。强烈建议使用一张真实的表而不是表模型作为中间表

 

模型案例分析:建立模型我们要对我们需求进行详细ORM(对象关系映射)的分析

学生表 student <————> grade    班级表       一对多(1个班级有多个学生)

用户表 user <————> role           角色表       一对多  (1个用户有多个角色)

角色表 role <————> permission    权限表      多对多 (角色和权限的多对多)

from flask import Flask
from datetime import datetime
from flask_sqlalchemy import SQLAlchemy
from config import Configs
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = Configs.SQLALCHEMY_DATABASE_URI
db = SQLAlchemy(app)
db.init_app(app=app)


class Grade(db.Model):
    """班级模型-1对多"""
    """1个班级有多个学生"""
    # 自定义表名
    __tablename__ = 'grade'
    g_id = db.Column(db.Integer, autoincrement=True, primary_key=True,comment='班级id')
    g_name = db.Column(db.String(20), unique=True,comment='姓名')
    g_create_time = db.Column(db.DateTime, default=datetime.now,comment='创建时间')
    # 设置与班级 一对多的关联关系
    students = db.relationship('Student',backref= 'grade')

    # 初始化字段 方便以后视图使用
    def __init__(self, name):
        self.g_name = name

    # 定义保存数据的方法 后面视图好使用
    def save(self):
        db.session.add(self)
        db.session.commit()


class Student(db.Model):
    """学生模型"""
    __tablename__ = 'student'
    s_id = db.Column(db.Integer, autoincrement=True, primary_key=True,comment='学生id')
    s_name = db.Column(db.String(16), unique=True,comment='姓名')
    s_sex = db.Column(db.Integer,comment='年龄')
    #设置关联的外键
    grade_id = db.Column(db.Integer, db.ForeignKey('grade.g_id'), nullable=True)

    def __init__(self, s_name, s_sex,grade_id):
        self.s_name = s_name
        self.s_sex = s_sex
        self.grade_id =grade_id

    def save(self):
        db.session.add(self)
        db.session.commit()


class User(db.Model):
    """用户模型"""
    __tablename__ = 'user'
    u_id = db.Column(db.Integer, autoincrement=True, primary_key=True,comment='用户id')
    username = db.Column(db.String(16), unique=True,comment='用户名')
    password = db.Column(db.String(250),comment='密码')
    u_create_time = db.Column(db.DateTime, default=datetime.now,comment='创建时间')
    # 用户和角色的一对多的关联关系
    role_id = db.Column(db.Integer, db.ForeignKey('role.r_id'))

    def __init__(self,username,password):
        self.username = username
        self.password = password

    def save(self):
        db.session.add(self)
        db.session.commit()



class Role(db.Model):
    """角色模型-1对多"""
    """1个用户有多个角色"""
    r_id = db.Column(db.Integer, autoincrement=True, primary_key=True,comment='角色id')
    r_name = db.Column(db.String(10),comment='名称')
    # 用户和角色的一对多的关联关系
    users = db.relationship('User', backref='role')

    __tablename__ = 'role'

    def __init__(self,r_name):
        self.r_name = r_name

    def save(self):
        db.session.add(self)
        db.session.commit()


# 角色和权限的(多对多的)关联表
# r_p为关联表的表名
r_p = db.Table('r_p',
               db.Column('role_id', db.Integer, db.ForeignKey('role.r_id'), primary_key=True),
               db.Column('permission_id', db.Integer, db.ForeignKey('permission.p_id'), primary_key=True))

class Permission(db.Model):
    """权限模型"""
    __tablename__ = 'permission'
    p_id = db.Column(db.Integer, autoincrement=True, primary_key=True,comment='权限id')
    p_name = db.Column(db.String(16), unique=True,comment='名称')
    p_er = db.Column(db.String(16), unique=True,comment='权限内容')
    # 角色和权限的多对多的关系
    roles = db.relationship('Role', secondary=r_p, backref=db.backref('permission', lazy=True))

    def __init__(self,p_name,p_er):
        self.p_name = p_name
        self.p_er = p_er

    def save(self):
        db.session.add(self)
        db.session.commit()


if __name__ == '__main__':
    db.create_all()
上面代码中,我们使用relationship方法建立了grade表和student表之间的一对多联系(一个班级对应多个学生),其中的backref为反向关系定义,为Studnet模型添加了一个grade属性

  

  

  

  

 
 

 

  

 

 

  

posted @ 2022-10-08 22:04  橘子偏爱橙子  阅读(390)  评论(0编辑  收藏  举报