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()
本文来自博客园,作者:橘子偏爱橙子,转载请注明原文链接:https://www.cnblogs.com/xfbk/p/16769122.html

浙公网安备 33010602011771号