Flask ORM建模

156 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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
111
212
321

那么这里就可以表示的就是:

用户张三(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建模就先介绍到这里,欢迎各位大佬多多指点。