开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情
之前说过了flask-sqlalchemy 配置,那么接下来要聊什么呢,接下来要聊Flask后端的一个核心知识点,ORM建模,建模是干啥呢?就是基于数据库来描述业务的主体和主体之间的关系。
建模流程
flask-sqlalchemy配置数据库建模的流程分为:
1、基于app配置数据库参数
2、绑定数据库引擎
3、创建数据表映射
4、同步数据库
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
#1、基于app配置数据库参数
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:@127.0.0.1:3306/test'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_ECHO'] = True
#2、绑定数据库引擎
db = SQLAlchemy(app)
#3、创建数据表映射
class Student(db.Model):
__tablename__ = "student" #数据库表名称
id = db.Column(db.Integer, primary_key = True) #数据库表字段
student_name = db.Column(db.String(32)) #数据库表字段
if __name__ == "__main__":
with app.app_context():
db.create_all() #同步数据库
app.run()
Flask ORM字段
Flask ORM需要映射表到数据库,所以需要按照类定义数据表名称,字段和字段描述。
| 字段 | 描述 |
|---|---|
| Integer | 整数 |
| Float | 小数 |
| String | 字符串,映射如数据库的varchar,需要指定长度 |
| Text | 文本 |
| Date | 时间,年月日 |
| Time | 时间,时分秒 |
字段常用的参数
| 参数名称 | 描述 |
|---|---|
| primary_key | 值为Ture,就将当前字段设置主键 |
| auto_increment | 值为Ture,字段自增长 |
| unique | 值为Ture,字段值唯一 |
| index | 值为Ture,字段添加索引 |
| default | 设置默认值 |
| nullable | 值为Ture,字段可以为null |
数据库业务关系
数据库当中对业务之间的关系有三种描述,分别是:
一对一关系,指的是两个表里的数据存储唯一的映射,比如,用户登录表和用户详情表,每个用户只有一个用户详情,同样一个用户详情只能对应一个用户。
一对多关系,指其中的一个表里的一条数据对应另外的一个表的多条数据,比如,一个用户对应多个订单,但是一个订单只属于一个用户。
多对多关系,指两张表当中的数据互相是多对多关系,比如,一个用户可以有多个权限,一个权限可以属于多个用户。
Flask ORM也有相关的映射,核心是通过ForginKey方法来进行约束的。
一对一关系,以用户和用户详情来举例:
class LoginUser(db.Model):
__tablename__ = "login_user"
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(32))
password = db.Column(db.String(32))
# 关联属性,是SQLALchemy提供给开发者快速引用外键模型的一个对象属性,不存在mysql中
# backref反向引用,类似django的related,通过外键模型查询主模型数据时的惯量属性
info = db.relationship('UserInfo', backref='info_user', uselist=False)
def __repr__(self):
return self.username
class UserInfo(db.Model):
__tablename__ = "user_info"
id = db.Column(db.Integer, primary_key=True)
address = db.Column(db.String(250))
mobile = db.Column(db.String(15))
# 外键 -在另一模型中添加外键
sid = db.Column(db.Integer, db.ForeignKey(LoginUser.id))
def __repr__(self):
return self.mobile
一对多关系,以用户和订单来举例,一对多关系和一对一关系的设置十分相似:
class UserInfo(db.Model):
__tablename__ = "user_info"
id = db.Column(db.Integer, primary_key=True)
address = db.Column(db.String(250))
mobile = db.Column(db.String(15))
# 关联属性,是SQLALchemy提供给开发者快速引用外键模型的一个对象属性,不存在mysql中
# backref反向引用,类似django的related,通过外键模型查询主模型数据时的惯量属性
info = db.relationship('Order', backref='order_user')
def __repr__(self):
return self.mobile
class Order(db.Model):
__tablename__ = "order"
id = db.Column(db.Integer, primary_key=True)
order = db.Column(db.String(32))
# 外键 -在另一模型中添加外键
user_info = db.Column(db.Integer, db.ForeignKey(UserInfo.id))
def __repr__(self):
return self.order
多对多关系会比较复杂,因为他需要一个中间表来约束两个关系表,以用户和权限为例:
用户表有id,权限表有id,为了维护他们之间的多对多需要创建一个中间表,记录那个用户的id对应那个权限的id,比如:
用户表
| id | 姓名 |
|---|---|
| 1 | 张三 |
| 2 | 李四 |
权限表
| id | 权限 |
|---|---|
| 1 | 查看数据 |
| 2 | 修改数据 |
| 3 | 新增数据 |
用户权限映射表(多对多维护表)
| id | 用户id | 权限id |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
那么这里就可以表示的就是:
用户张三(id为1) 有权限:查看数据(id为1),修改数据(id为2),而李四(id为2)只有 查看数据(id为1)的权限。
user_permission = db.Table(
'user_permission',
db.Column('user_id', db.Integer, db.ForeignKey('user.id')), #注意这里用的使用表名.id不是类名.id
db.Column('pro_id', db.Integer, db.ForeignKey('promission.id'))
)
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(250))
#反向映射这边需要加上secondary指向中间表
username_promission = db.relationship('Promission',secondary=user_permission,backref=db.backref('user'))
def __repr__(self):
return self.username
class Promission(db.Model):
__tablename__ = "promission"
id = db.Column(db.Integer, primary_key=True)
pro_name = db.Column(db.String(250))
def __repr__(self):
return self.pro_name
最基本的Flask ORM建模就先介绍到这里,欢迎各位大佬多多指点。