Flask学习笔记(八)-Flask-Sqlalchemy基本使用详解
一、环境的安装
1 2 | pip install flask-sqlalchemy pip install pymysql |
二、基本使用
1、最小型应用:
对于Flask 的应用来说,需要做的就是为 Flask 实例选择加载配置,然后把 SQLlchemy 实例传递给它即可:
示例展示:
flask_SQLalchemy
------ app.py
------ config.py
config.py
1 2 3 4 5 6 7 8 9 10 11 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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
表中1 2 3 4 5 6 7 8 9 10 | 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
这条数据:
1 2 3 4 5 6 7 8 | 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:
1 2 3 4 5 6 7 8 9 | def update_test(): "" " 修改数据 : return : "" " admin = User.query.get( 1 ) admin.email = 'admin_xgh@qq.com' db.session.add(admin) db.session.commit() |
查:下面我们访问这个表,看下数据是否已插入成功:
1 2 3 4 5 6 7 8 9 | 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 权限表 多对多 (角色和权限的多对多)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | 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() |
本文来自博客园,作者:橘子偏爱橙子,转载请注明原文链接:https://www.cnblogs.com/xfbk/p/16769122.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通