flask中常见的关系模型定义

heimaguangzhou      2022-02-17     230

关键词:

flask中常见的关系模型定义
一对多
应用场景:角色与所属于该角色的用户(角色表与多用户表)

[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
class Role(db.Model):
    __tablename__ = ‘roles‘
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    users = db.relationship(‘User‘, backref=‘role‘, lazy=‘dynamic‘)
 
class User(db.Model):
    __tablename__ = ‘users‘
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True, index=True)


relationship函数:sqlalchemy对关系之间提供的一种便利的调用方式,关联不同的表
backref:在关系的另一模型中添加反向引用
lazy参数:决定了 SQLAlchemy 什么时候从数据库中加载数据,有四个可选方式:‘select‘,‘joined‘,‘subquery‘,‘dynamic‘:
‘select‘(默认值):SQLAlchemy 会在使用一个标准 select 语句时一次性加载数据;
‘joined‘:让 SQLAlchemy 当父级使用 JOIN 语句是,在相同的查询中加载关系;
‘subquery‘:类似 ‘joined‘ ,但是 SQLAlchemy 会使用子查询;
‘dynamic‘:SQLAlchemy 会返回一个查询对象,在加载这些条目时才进行加载数据,大批量数据查询处理时推荐使用。


一对一
应用场景:用户与该用户对应的地址信息

[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
class User(db.Model):
    __tablename__ = ‘users‘
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True, index=True)
    address= relationship("Address", backref=backref("user", uselist=False))
 
class Address(db.Model):
    __tablename__ = ‘users‘
    id = db.Column(db.Integer, primary_key=True)
    name= db.Column(db.String(64))



在一对多关系基础上的用户表中使用backref函数,并添加uselist参数来表示一对一关系。


多对多
应用场景:学生与其选修的课程(学生表与选修课程表)

[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
tb_student_course = db.Table(‘tb_student_course‘,
                             db.Column(‘student_id‘, db.Integer, db.ForeignKey(‘students.id‘)),
                             db.Column(‘course_id‘, db.Integer, db.ForeignKey(‘courses.id‘))
                             )
 
class Student(db.Model):
    __tablename__ = "students"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    courses = db.relationship(‘Course‘, secondary=tb_student_course,
                              backref=db.backref(‘students‘, lazy=‘dynamic‘),
                              lazy=‘dynamic‘)
 
class Course(db.Model):
    __tablename__ = "courses"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)


secondary:指定多对多关系中关系表的名字
backref:在关系的另一模型中添加反向引用,并且决定反向查询时什么时候从数据库中加载数据

自关联一对多
应用场景:评论与该评论的子评论(评论表)

[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
class Comment(db.Model):
    __tablename__ = "comments"
    id = db.Column(db.Integer, primary_key=True)
    # 评论内容
    content = db.Column(db.Text, nullable=False)
    # 父评论id
    parent_id = db.Column(db.Integer, db.ForeignKey("comments.id"))
    # 父评论(也是评论模型)
    parent = db.relationship("Comment", remote_side=[id],
                             backref=db.backref(‘childs‘, lazy=‘dynamic‘))


remote_side:指定自关联的关系字段,为当前表主键

自关联多对多
应用场景:用户关注其他用户(用户表,中间表)

[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
tb_user_follows = db.Table(
    "tb_user_follows",
    db.Column(‘follower_id‘, db.Integer, db.ForeignKey(‘info_user.id‘), primary_key=True),  # 粉丝id
    db.Column(‘followed_id‘, db.Integer, db.ForeignKey(‘info_user.id‘), primary_key=True# 被关注人的id
)
 
class User(db.Model):
    __tablename__ = "info_user"
    id = db.Column(db.Integer, primary_key=True
    name = db.Column(db.String(32), unique=True, nullable=False)
    # 用户所有的粉丝,添加了反向引用followed,代表用户都关注了哪些人
    followers = db.relationship(‘User‘,
                                secondary=tb_user_follows,
                                primaryjoin=id == tb_user_follows.c.followed_id,
                                secondaryjoin=id == tb_user_follows.c.follower_id,
                                backref=db.backref(‘followed‘, lazy=‘dynamic‘),
                                lazy=‘dynamic‘)


primaryjoin:明确指定两个模型之间使用的关系条件
secondaryjoin:在SQLAlchemy中无法自行决定时,指定多对多关系中的二级关系条件

更多技术资讯可关注:gzitcast

orm

...处理App/views视图函数处理业务逻辑协调模板和模型之间的关系App/models模型定义模型结构获得数据库中的表的关系映射3、数据迁移将模型映射 查看详情

flask之自定义模型类(代码片段)

4.3自定义模型类定义模型模型表示程序使用的数据实体,在Flask-SQLAlchemy中,模型一般是Python类,继承自db.Model,db是SQLAlchemy类的实例,代表程序使用的数据库。类中的属性对应数据库表中的列。id为主键,是由Flask-SQLAlchemy管理。... 查看详情

mysql中新手所要了解的关系模型与数据表,常见数据类型!!!

关系模型:是由若干个关系模式组成的集合,关系模式的实例称为关系,每个关系实际上是一张二维表格。关系模型用键导航数据,其表格简单。关系模型中的术语: 关系(Relation) 元组(Tuple&#x... 查看详情

深入浅出flask(49):flask_sqlalchemy的创建一对多的关系表

在我们建立数据库的模型时,使用得最多的就是一对多的关系,比如一个家庭有多个成员,一个学校有多个学生,一个学生有多门成绩。要表示这种关系,往往建立两个表,一个表用来表示一方的数据,另外一个表表示多方的数... 查看详情

flask学习十一关注着

数据库关系1.1多对多关系添加第三张表(关联表),多对多关系可以分解成原表和关联表之间的两个一对多的关系多对多仍然使用db.relationship()方法定义,但是secondary参数必须设定为关联表,多对多关系可以在任何一个表中定义... 查看详情

Flask-SQLAlchemy:用户角色模型和关系

】Flask-SQLAlchemy:用户角色模型和关系【英文标题】:Flask-SQLAlchemy:UserroleModelsandrelationship【发布时间】:2022-01-1210:32:18【问题描述】:我正在尝试创建Flask-SqlAlchemy数据库模型,并且需要将用户链接到单个角色。示例角色:“用户... 查看详情

Flask/SQLAlchemy - 多对多关系的关联模型和关联表之间的区别?

】Flask/SQLAlchemy-多对多关系的关联模型和关联表之间的区别?【英文标题】:Flask/SQLAlchemy-Differencebetweenassociationmodelandassociationtableformany-to-manyrelationship?【发布时间】:2015-08-0501:45:29【问题描述】:我从FlaskMega教程开始学习这些东... 查看详情

flask:05-一首歌的时间掌握flask数据模型(01)(代码片段)

数据模型数据库回顾分类:关系型数据库:MySQL、sqlite、…非关系型数据库:Redis、MongoDB、…操作:执行原生SQL语句,每次都需要拼接SQL语句,非常繁琐而且特别容易出错。ORM(对象关系映射),使用ORM可以通过对对象的操作完成... 查看详情

flask框架从入门到精通之模型关系(十七)(代码片段)

知识点:1、模型关系参照一、概况在数据库中,我们知道数据关系大概有如下几种:一对一、一对多、多对多、自关联等。我们模型已经描述过了一对多,那么下面我们在用模型把其它关系也写出来。关系一对一... 查看详情

flask框架从入门到精通之模型关系(十七)(代码片段)

知识点:1、模型关系参照一、概况在数据库中,我们知道数据关系大概有如下几种:一对一、一对多、多对多、自关联等。我们模型已经描述过了一对多,那么下面我们在用模型把其它关系也写出来。关系一对一... 查看详情

flask中定义模型类的几种情况(代码片段)

fromdatetimeimportdatetimefromwerkzeug.securityimportgenerate_password_hash,check_password_hashfromutilsimportconstantsfrom.importdbclassBaseModel(object):"""模型基类,为每个模型补充创建时间与更新时间"""create_time=db.Col 查看详情

立方体/表格模型中的属性关系

...布时间】:2020-11-1419:23:03【问题描述】:我想知道一些更常见的属性关系“模式”在各种设置中可能是什么。我能想到的最常见的两个是:Geography:类似大陆>国家>州>城市>...Time:类似于年>季度>月>日>...还有哪些... 查看详情

flask之数据库设置(代码片段)

...据库迁移邮件扩展4.1数据库的设置Web应用中普遍使用的是关系模型的数据库,关系型数据库把所有的数据都存储在表中,表用来给应用的实体建模,表的列数是固定的,行数是可变的。它使用结构化的查询语言。关系型数据库的... 查看详情

flask定义数据库关系(一对一)(代码片段)

一对一我们将使用国家和首都来演示一对一关系:每个国家只有一个首都。反过来,一个城市也只能作为一个国家的首都。一对一关系如下: 在示例程序中,Country类表示国家,Capital类表示首都。建立一对一关系后,我们将... 查看详情

flask定义数据关系(多对一)(代码片段)

多对一一对多关系反过来就是多对一关系,这两种关系模式分别从不同的视角出发。一个作者拥有多篇文章,反过来就是多篇文章属于同一个作者。为了便于区分,我们使用居民和城市来演示多对一关系:多个居民住在同一个城... 查看详情

导入关系中使用的 SQLAlchemy 模型?

】导入关系中使用的SQLAlchemy模型?【英文标题】:ImportingSQLAlchemymodelsusedinrelationship?【发布时间】:2019-10-2221:03:55【问题描述】:我是SQLAlchemy的新手(使用Python3),发现以下令人费解。在我的简单示例中,在单独的文件中定义... 查看详情

Ember 关系在测试环境中不尊重模型自定义适配器

】Ember关系在测试环境中不尊重模型自定义适配器【英文标题】:EmberRelationshipsAreNotRespectingModelCustomAdapterinTestEnvironment【发布时间】:2020-04-0720:19:00【问题描述】:在我的Ember.js应用程序中,我有一个模型公司,它带有一个指向AP... 查看详情

Flask-restplus:如何使用“allOf”操作定义嵌套模型?

】Flask-restplus:如何使用“allOf”操作定义嵌套模型?【英文标题】:Flask-restplus:howtodefineanestedmodelwith\'allOf\'operation?【发布时间】:2018-03-1002:00:04【问题描述】:创建一个pythonflaskrestplus服务器应用程序,我正在尝试使用\'allOf\'运... 查看详情