2018-06-17 深入理解SQLAlchemy中的backref 是什麼,和舊版back-populate的區別
深入理解SQLAlchemy中的backref 是什麼,和舊版back-populate的區別:
看了 網上相關材料如下 :
https://www.zhihu.com/question/38456789
https://l.jifangcheng.com/p/46
基本 自悟的總結如下:
1) backref 是 back-populate的更高階,更簡化版本,是新對舊的替代關係。
because of 舊版的 back-populate 必須 雙向的,(囉嗦的back-populate 在 有relationship的2個類結構下都宣告)
而 backref ,可以 單向的宣告,在任何一個 類下,都可以,
2) ,backref ,一旦使用了,還具備支援 具體巢狀功能的功能:
看下面的 明明是 1對多關係的 (restaurant -對 history ,即 同一個 restaurant可以 對應 多個 它的history 記錄)
但有了 backref的描繪後,就可以 用 history['restaurants'] (這個寫法 == 使用restaurant物件,注意這裡的history是histories類的一個例項表) 的方式 直接 取 restaurants 類的表結構裡的col 值
下面為轉載: 說的更清楚。
https://l.jifangcheng.com/p/46
SQLAlchemy 中的 backref 和 back_populates
SQLAlchemy 中的 relationship 函式為模型之間的關係提供了一種便利的呼叫方式,backref 引數則對關係提供反向引用的宣告。
下面的例子定義了一個簡單的一對多的關係
class Parent(Base):__tablename__ ='parent'id = Column(Integer, primary_key=True) children = relationship("Child")class Child(Base):__tablename__ ='child'id = Column(Integer, primary_key=True) parent_id = Column(Integer, ForeignKey('parent.id'))
一個 Parent 可以有多個 Child,一個 Child 只有一個 Parent
如果我們需要查詢一個 Parent 的 Child,很簡單,因為我們用了 relationship 函式將 Parent 的 children 欄位和 Child表關聯了起來,所以直接取 Parent 例項的 children 屬性就可以了:
parent.children
但是如果我們要查詢一個 Child 的 Parent 要怎麼操作呢?Child 模型裡面有一個 parent_id 欄位,這是一個關聯到其對應 Parent 的外來鍵,我們可以拿到這個 Child 的 Parent 的 id,然後用這個 id 去 Parent 表裡面查詢對應的 Parent 物件:
parent_id = child.parent_id
parent = session.query(Parent).filter_by(id=parent_id).first()
這也是一個方法,不過太麻煩了,SQLAlchemy 為關係的反向引用提供了兩種更為簡單、易用的方法:backref 和 back_populates
backref 引數提供了對關係反向引用的宣告:
class Parent(Base):__tablename__ ='parent'id = Column(Integer, primary_key=True) children = relationship("Child", backref="parent")
在定義關係的時候使用 backref 引數,該引數使得 Child 物件可以直接使用 backref 引數定義的 parent 值來訪問其對應的 Parent
parent = child.parent
back_populates 可以實現和 backref 同樣的效果,不過在模型的定義上要麻煩一點:
class Parent(Base):__tablename__ ='parent'id = Column(Integer, primary_key=True) children = relationship("Child", back_populates="parent")class Child(Base):__tablename__ ='child'id = Column(Integer, primary_key=True) parent_id = Column(Integer, ForeignKey('parent.id')) parent = relationship("Parent", back_populates="children")
在 Parent 和 Child 中都定義一個相互關聯的 relationship,Parent 可以通過 children 欄位獲取其對應的 Child,Child也可以通過 parent 欄位獲取其對應的 Parent
back_populates 和 backref 達到的效果都是一樣的,對於它們的區別,我的理解是 backref 是隱式地宣告瞭關係反向引用的欄位,back_populates 則是顯式地定義了關係反向引用的欄位。相比於 backref,back_populates 使得模型之間的關係理清晰,所有的關係一目瞭然,不過也比 backref 麻煩一點,各有各的好處。
參考連結
相關文章
- 深入探究Java中equals()和==的區別是什麼Java
- SQLAlchemy中filter()和filter_by()有什麼區別SQLFilter
- 深入理解equals和==的區別
- Laravel中 FeatureTest和 UnitTest的區別是什麼Laravel
- python is和==的區別是什麼?Python
- Flask-sqlalchemy中 backref lazy的引數例項解釋和選擇FlaskSQL
- 在Pandas中 SQL操作:SQLAlchemy和PyMySQL的區別MySql
- 在js中attribute和property的區別是什麼?JS
- 在Linux中,tomcat和nginx的區別是什麼?LinuxTomcatNginx
- 【Java面試】Mybatis中#{}和${}的區別是什麼?Java面試MyBatis
- 127.0.0.1和0.0.0.0的區別是什麼?127.0.0.1
- cat和vim的區別是什麼?
- reactjs和vuejs的區別是什麼ReactJSVue
- ArrayList和LinkedList的區別是什麼
- 什麼是PCB?什麼是PCBA?PCB和PCBA的區別?
- pycharm社群版、專業版和教育版區別是什麼?PyCharm
- Rust中,*const T和*mut T的區別是什麼?Rust
- http協議中,“get”和“post”的區別是什麼HTTP協議
- 暴雪中國:重製版中文翻譯和舊版有什麼“大”區別?
- Linux中Vi和Vim區別是什麼?Linux
- getElementById和querySelector方法的區別是什麼?
- decimal,float和double的區別是什麼?Decimal
- 什麼是HTTP? HTTP 和 HTTPS 的區別?HTTP
- 前端和後端的區別是什麼?前端後端
- python中類方法的區別是什麼Python
- 家庭版win10和專業版的區別_win10專業版和家庭版區別是什麼Win10
- 在Linux中,BASH 和 DOS之間的區別是什麼?Linux
- 你和架構師的的區別是什麼?架構
- 過渡和動畫的區別是什麼?動畫
- Kata和Kaizen之間的區別是什麼?AI
- python屬性和方法的區別是什麼Python
- python和c語言的區別是什麼PythonC語言
- 連梁和框架樑的區別是什麼?框架
- border:0和border:none的區別是什麼None
- Go 中 make 與 new 的區別是什麼?Go
- 影片播放元件中,樣式全屏和全屏的區別是什麼?元件
- powershell和cmd區別是什麼
- Mssql和Mongodb區別是什麼SQLMongoDB