一、环境的安装
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属性
标签:__,Sqlalchemy,Flask,self,db,Column,详解,True,id From: https://www.cnblogs.com/xfbk/p/16769122.html