Flask 对象关系
建立一个关系
- from sqlalchemy import Column, Integer, String, MetaData, ForeignKey
- from sqlalchemy.ext.declarative import declarative_base
- from sqlalchemy.orm import relationship, backref
- metadata = MetaData()
- Base = declarative_base(metadata=metadata)
- class User(Base):
- __tablename__ = 'users'
- id = Column(Integer, primary_key=True)
- name = Column(String)
- password = Column(String)
- def __repr__(self):
- return "<User(name='%s', password='%s')>" % (self.name, self.password)
第二个表Address与User
关联,可以被映射和查询。Users 在可以存储任意数量的电子邮件地址关联的用户名。这意味着一个从users
到一个存储电子邮件地址的新表Addresses
的一对多
关联。我们在Address
中使用声明定义这张表与User
的映射:
- class Address(Base):
- __tablename__ = 'addresses'
- id = Column(Integer, primary_key=True)
- email_address = Column(String, nullable=False)
- #ForeignKey函数是一个应用于Column的指令,表明这一列的值应该保存指定名称的远程列的值。
- user_id = Column(Integer, ForeignKey('users.id'))
- user = relationship("User", backref='addresses', lazy='dynamic')
- def __repr__(self):
- return "<Address(email_address='%s')>" % (self.email_address)
- # 第一个参数为对应参照的类User,第二个参数backref表示给关联的数据库模型添加一个属性
- # 第三个参数lazy决定了什么时候SQLALchemy从数据库中加载数据。
- # relationship()的参数中有一个称为backref()的relationship()的子函数,反向提供详细的信息,
- # 即在users中添加User对应的Address对象的集合,保存在User.addresses中。
上述类使用了ForeignKey
函数,它是一个应用于Column
的指令,表明这一列的值应该保存指定名称的远程列的值
。这是关系数据库的一个核心特征,是“胶水”,将原本无关的表变为有丰富的重叠关系的集合。上面的ForeignKey
表示,Addresses.user_id
列的值应该等于users.id
列中的值,即,users
的主键。
第二个函数,称为relationship()
, 它告诉 ORM ,Address
类本身应该使用属性Address.user
链接到User
类。relationship()
使用两个表之间的外键关系来确定这个链接的性质,这个例子中,确定Address.user
将要成为多对一
中多的一侧。relationship()
的参数中有一个称为backref()
的relationship()
的子函数,反向提供详细的信息, 即在users
中添加User
对应的Address
对象的集合,保存在User.addresses
中。多对一
关系的反向始终是一对多
的关系。一个完整的可用的relationship()
配置目录在基本关系模式。
两个互补关系, Address.user
和User.addresses
被称为一个双向关系,并且这是SQLAlchemy ORM
的一个关键特性。
- #models.py
- 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(UserMixin, db.Model):
- __tablename__ = 'users'
- id = db.Column(db.Integer, primary_key=True)
- email = db.Column(db.String(64), unique=True, index=True)
- username = db.Column(db.String(64), unique=True, index=True)
- password_hash = db.Column(db.String(128))
- role_id = db.Column(db.Integer, db.ForeignKey('roles.id'), nullable=True)
- ticketholiday_id = db.relationship('Ticketholiday', backref='user', lazy='dynamic')
- class Ticketholiday(db.Model):
- __tablename__ = 'ticketholidays'
- id = db.Column(db.Integer, primary_key=True)
- type = db.Column(db.Integer)
- about = db.Column(db.Text)
- user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
注意你在Role数据库模型中的users,它并不是roles表中的字段,users = db.relationship('User', backref='role', lazy='dynamic'),relationship的第一个参数表示这个关系的另一个数据库模型是哪个,这里是User,第二个参数backref表示给关联的数据库模型添加一个属性,这里是role。
也就是说,你可以通过User模型的role这个属性去访问Role模型,比如你在views.py中的查询结果,你可以通过user.role.name得到roles表中对应记录的name,user.role.id则得到roles表中对应记录的id
注意名称的大小写,一一对应
Flask 对象关系的更多相关文章
- Flask-ORM-数据库的对象关系映射模型-备忘
ORM对象关系映射模型的特点: 优点 : 只需要面向对象编程, 不需要面向数据库编写代码. 对数据库的操作都转化成对类属性和方法的操作. 不用编写各种数据库的sql语句. 实现了数据模型与数据库的解耦 ...
- Flask-SQLAlchemy 配置,处理对象-关系,一对多,多对多
ORM(Object Relational Mapper) 对象关系映射.指将面对对象得方法映射到数据库中的关系对象中. Flask-SQLAlchemy是一个Flask扩展,能够支持多种数据库后 ...
- 死去活来,而不变质:Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?
写在前面 阅读目录: 设计误区 数据库已死 枚举映射 关联映射 后记 在上一篇<一缕阳光:DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)?>博文中, ...
- 解析大型.NET ERP系统数据访问 对象关系映射框架LLBL Gen Pro
LLBL Gen Pro是一个为.NET开发人员设计的的对象关系映射(ORM)框架,与NHibernate,Entity Framework等框架一样,通过实体与数据表的映射,实现关系数据库持久化. ...
- Hibernate(开放源代码的对象关系映射框架)
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自 ...
- ORM即 对象-关系映射(转自:微冷的雨)
ORM即 对象-关系映射: 将数据库中的数据关系表,映射为实体对象. 灵动思绪EF(Entity FrameWork) 作者: 微冷的雨 来源: 博客园 发布时间: 2013-01-22 16:2 ...
- LLBL Gen Pro 4.2 Lite 免费的对象关系映射开发框架与工具
LLBL Gen Pro是一款优秀的对象关系映射开发框架,自2003年发布以来,一直有广泛的客户群.LLBL Gen Pro有几个标志性的版本,2.5/2.6是一个很稳定的版本,公司的一些旧的项目仍然 ...
- hibernate(四)__由表逆向创建Domain对象和对象关系映射文件
之前我们是手写Domain对象和对象关系映射文件->然后生成数据库中的Table. 现在我们反过来先在数据库中建好Table->然后用工具生成Domain对象和对象关系映射文件. 步骤: ...
- 对象关系映射ORM
对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效 ...
随机推荐
- c/c++基本数据类型转换
If either operand is of type long double, the other operand is converted to type long double. If the ...
- 前缀、中缀、后缀表达式以及简单计算器的C++实现
前缀表达式(波兰表达式).中缀表达式.后缀表达式(逆波兰表达式) 介绍 三种表达式都是四则运算的表达方式,用以四则运算表达式求值,即数学表达式的求解. 前缀表达式 前缀表达式是一种没有括号的算术表达式 ...
- bzoj 2243
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 8800 Solved: 3305[Submit][Status ...
- 利用ansible来做tomcat应用的持续交付
https://www.jianshu.com/p/fca8f91ae223 在做持续交付这件事,想必大家都是用jenkins这款程序来做基石.当然,我们这次也是用jenkins作为承载工具,jenk ...
- Laravel 返回 JSON 格式
第一种方法: 第一步.编写 BaseRequest首先我们需要构建一个 BaseRequest 来重写 Illuminate\Http\Request ,修改为默认优先使用 JSON 响应: app/ ...
- linux命令总结kill命令详解
1.作用 kill命令用来中止一个进程. 2.格式 kill [ -s signal | -p ] [ -a ] pid ... kill -l [ signal ] 3.参数 -s:指定发送的信号. ...
- [洛谷P4492] [HAOI2018]苹果树
洛谷题目链接:[HAOI2018]苹果树 题目背景 HAOI2018 Round2 第一题 题目描述 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C ...
- HBase基本概念
HBase是什么 HBase构建在 HDFS 之上的分布式列式键值存储系统.HBase内部管理的文件全部存储在HDFS中. HBase VS HDFS HDFS适合批处理场景 不支持数据随机查找 不适 ...
- C 语言中指针初始化为字符串常量 不可通过该指针修改其内容
char b[] = "hello"; 则“hello”存于栈中,因为定义的是一个数组. char *b = "hello"; 则"hello&quo ...
- node的导入导出
node的每一个文件,都是一个域,那么里面所有的变量都不允许被外界引用,除非导出.要使用外界的变量,也必须使用导入的方式来导入.import 文件路径. css可以直接使用import +文件路径导入 ...