首页 > 数据库 >Flask学习笔记(八)-Flask-Sqlalchemy基本使用详解

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

时间:2022-10-08 22:14:04浏览次数:53  
标签:__ Sqlalchemy Flask self db Column 详解 True id

一、环境的安装

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:[email protected]: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='[email protected]')
    guest = User(username='guest', email='[email protected]')
    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这条数据,让其邮箱变更为[email protected]:  

def update_test():
    """
    修改数据
    :return:
    """
    admin = User.query.get(1)
    admin.email = '[email protected]'
    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属性

  

  

  

  

   

 

  

 

 

  

标签:__,Sqlalchemy,Flask,self,db,Column,详解,True,id
From: https://www.cnblogs.com/xfbk/p/16769122.html

相关文章

  • grep命令详解
    grep搜索文本的匹配内容,逐行搜索所指定的文件或标准输入,并显示匹配模式的每一行。 常用的grep选项有: -c只输出匹配行的计数。 -i不区分大小写(只适用于单字符)。 ......
  • 小学二年级都能看懂的 KMP算法详解
    介绍先上一道模板题:P3375【模板】KMP字符串匹配(难以想象这只是一道黄题)(而manacher竟然是蓝题)大意就是给你两个字符串,问其中一个在另一个里面出现过几次。至于border什......
  • Graphics类drawRect()方法参数详解
    代码:importjavax.swing.*;importjava.awt.*;publicclassMain{publicstaticvoidmain(String[]args){JFrameframe=newJFrame();mypa......
  • liunx之expect操作详解
    导航:一、expect安装、介绍、使用场景二、expect使用原理三、expect使用语法四、expect使用举例五、expect相关错误处理---------分割线----------一......
  • NFT(GameFi)链游系统开发详解方案
    什么是GameFi经济Specifically,thisincludesthefivetechnical)supportforcesofthemetauniverse,namely,thecommunicationfoundation"5g"ofthemetauniver......
  • 34.HyperLinkedModelSerializer详解
    HyperLinkedModelSerializer继承ModelSerializer,只是自动多出了一个url字段,其他都是一样的不同之处在于使用超链接来表示关联关系而不是主键默认情况下HyperLinkedModel......
  • 33.ModelSerializer详解
    ModelSerializer特点根据Model模型的定义,自动生成字段自动生成相应的验证器实现create和update自动默认将关系字段映射成PrimaryKeyRelatedField主键关系字段 Mod......
  • 【Python小工具】爬虫之使用OpenCV识别数字+字母验证码详解,告别收费
    Python小工具系列是一个使用Python实现各种各样有意思的小玩意儿的系列,包括制作个性化的二维化、词云、简单爬虫等,持续更新中,如果你感兴趣就关注一波吧!一、基本介绍......
  • Linux的free命令详解
    -k以KB为单位显示内存使用情况-m以MB为单位显示内存使用情况-g以GB为单位显示内存使用情况-o不显示缓冲区调节列-s<间隔秒数>持续观察内存使用状况......
  • GPIO点灯工程的详解
    GPIO点灯工程的实现1、时钟的选择BYPASSClockSource(旁路时钟源)指无需使用外部晶体时所需的芯片内部时钟驱动组件,直接从外界导入时钟信号。Crystal/CeramicResonat......