relationship函数是sqlalchemy对关系之间提供的一种便利的调用方式, backref参数则对关系提供反向引用的声明

1 背景

如没有relationship,我们只能像下面这样调用关系数据

 
 

如果在User中使用relationship定义addresses属性的话,

addresses = relationship('Address')
则我们可以直接在User对象中通过addresses属性获得指定用户的所有地址

2 backref属性


大致原理应该就是sqlalchemy在运行时对Address对象动态的设置了一个指向所属User对象的属性,这样就能在实际开发中使逻辑关系更加清晰,代码更加简洁了

2 例子

>>> from sqlalchemy import Column, Integer, String
>>> class User(Base):
... __tablename__ = 'users'
...
... id = Column(Integer, primary_key=True)
... name = Column(String)
... fullname = Column(String)
... password = Column(String)
...
... def __repr__(self):
... return "<User(name='%s', fullname='%s', password='%s')>" % ( self.name, self.fullname, self.password)
>>> from sqlalchemy import ForeignKey
>>> from sqlalchemy.orm import relationship, backref >>> class Address(Base):
... __tablename__ = 'addresses'
... id = Column(Integer, primary_key=True)
... email_address = Column(String, nullable=False)
... user_id = Column(Integer, ForeignKey('users.id'))
...
... user = relationship("User", backref=backref('addresses', order_by=id))
...
... def __repr__(self):
... return "<Address(email_address='%s')>" % self.email_address
ForeignKey表示,Addresses.user_id列的值应该等于users.id列中的值,即,users的主键
relationship(), 它告诉 ORM ,Address类本身应该使用属性Address.user链接到User类
relationship()的参数中有一个称为backref()的relationship()的子函数,反向提供详细的信息, 即在users中添加User对应的Address对象的集合,保存在User.addresses中
两个互补关系, Address.userUser.addresses被称为一个双向关系,并且这是SQLAlchemy ORM的一个关键特性

ORM SQLAlchemy - 建立一个关系 relationship的更多相关文章

  1. ORM SQLAlchemy 表于表的关系

    1表与表之间三种关系 1.1 一对一关系 举例: 一个丈夫对应一个妻子,一个妻子对应一个丈夫 1.2 一对多关系 举例:一个人可以拥有多辆汽车,要求查询某个人拥有的所有车辆 分析:这种情况其实也可以采 ...

  2. SQLAlchemy建立数据库模型之间的关系

    一对多关系 多对一关系 多对多关系 一对一关系 一对多关系(一个作者,多篇文章) ## 一对多关系,单作者-多文章,外键不可少 ## 外键(ForeignKey)总在多的那边定义,关系(relatio ...

  3. ORM SQLAlchemy - 基本关系模式

    1 一对多 一个parent对多个child,一对多关系添加一个外键到child表,用于保存对应parent.id的值,引用parent.relationship()在parent中指定,引用/保存 ...

  4. git将本地已经存在的分支和一个指定的远端分支建立映射关系

    Make an existing Git branch track a remote branch? Given a branch foo and a remote upstream: As of G ...

  5. 冰冻三尺非一日之寒-mysql(orm/sqlalchemy)

    第十二章  mysql ORM介绍    2.sqlalchemy基本使用 ORM介绍: orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似pyt ...

  6. Python开发【十二章】:ORM sqlalchemy

    一.对象映射关系(ORM) orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却 ...

  7. python ORM - sqlalchemy 操作使用

    python操作数据库 使用 ORM - sqlalchemy,pymsql 安装: pip install pymsq pip install sqlalchemy 一. '''连接数据库'''   ...

  8. 【tips】ORM - SQLAlchemy操作MySQL数据库

    优先(官方文档SQLAlchemy-version1.2): sqlalchemy | 作者:斯芬克斯 推荐一(长篇幅version1.2.0b3):python约会之ORM-sqlalchemy | ...

  9. [转]使用Scrapy建立一个网站抓取器

    英文原文:Build a Website Crawler based upon Scrapy 标签: Scrapy Python 209人收藏此文章, 我要收藏renwofei423 推荐于 11个月 ...

随机推荐

  1. 关于mysql 自增长 主键

    我遇到过 我这样建表 ![](http://images2017.cnblogs.com/blog/1128666/201709/1128666-20170917222547078-151122413 ...

  2. TCP协议和UDP协议的对比【转】

    原文:https://blog.csdn.net/lzj2504476514/article/details/81454754 一.TCP协议的主要特点(1)TCP是面向连接的运输层协议:(2)每一条 ...

  3. 关于GPU的传输速度与什么有关??

    1. i5-8250U   1.6GHz 2. PCIE 3  4K 105fps  =  10.45Gps   4K 一帧  = 99.5Mbit 4K YUV444 + mask = 3840*2 ...

  4. Linux Jetbrains Datagrip 图标找不到

    问题 系统版本:Ubuntu 18.04,Datagrip版本:2019.2 从官网下载的 tar.gz 解压之后,找到 datagrip.sh 就可以使用了.但是有个问题,它没有自动创建快捷方式,所 ...

  5. 如何对SAP Leonardo上的机器学习模型进行重新训练

    Jerry之前的两篇文章介绍了如何通过Restful API的方式,消费SAP Leonardo上预先训练好的机器学习模型: 如何在Web应用里消费SAP Leonardo的机器学习API 部署在SA ...

  6. Elasticsearch 9300无法访问,客户端出现NoNodeAvailableException[None of the configured nodes are available:  [{#transport#‐1}{exvgJLR‐RlCNMJy‐hzKtnA}

    1.  进入容器 docker exec ‐it ID /bin/bash 2. 拷贝配置文件到宿主机 docker cp  ID:/usr/share/elasticsearch/config/el ...

  7. DNS zone file

    zone file格式最初由Berkeley Internet Name Domain(BIND)软件包使用,但已被其他DNS server software广泛采用.它们中的一些(例如NSD,Pow ...

  8. 网络OSI 7层模型

    OSI 的英文全程为Open Systems Interconnection ,中文全程为开放系统互联参考模型.是一个逻辑上的定义.主要用途使通信和计算系统自由互联,而不依赖其他架构或技.主要目标就是 ...

  9. java实现网络请求超时自动熔断

    原文:https://www.jianshu.com/p/326465500d1c?utm_campaign 使用场景 之前在实现熔断降级组件时,需要实现一个接口的超时中断,意思是,业务在使用熔断降级 ...

  10. 解压gz文件有误

    tar: This does not look like a tar archive tar: Skipping to next header tar: Exiting with failure st ...