python最牛web框架居然是「它」
sqlalchemy中的表關係
表之間的關係存在三種:一對一、一對多、多對多。而SQLAlchemy中的ORM也可以模擬這三種關係。因為一對一其實在SQLAlchemy中底層是通過一對多的方式模擬的,所以先來看下一對多的關係:
1. 一對多:拿User表為例,假如現在要添加一個功能,要保存用戶的郵箱帳號,並且郵箱帳號可以有多個,這時候就必須創建一個新的表,用來存儲用戶的郵箱,然後通過user.id來作為外鍵進行引用,先來看下郵箱表的實現:
其中,在User表中添加的addresses欄位,可以通過User.addresses來訪問和這個user相關的所有address。在Address表中的user欄位,可以通過Address.use來訪問這個user。達到了雙向綁定。表關係已經建立好以後,接下來就應該對其進行操作,先看以下代碼:
首先,創建一個用戶,然後對這個jack用戶添加兩個郵箱,最後再提交到資料庫當中,可以看到這裡操作Address並沒有直接進行保存,而是先添加到用戶裡面,再保存。
2.. 一對一:一對一其實就是一對多的特殊情況,從以上的一對多例子中不難發現,一對應的是User表,而多對應的是Address,也就是說一個User對象有多個Address。因此要將一對多轉換成一對一,只要設置一個User對象對應一個Address對象即可,看以下示例:
從以上例子可以看到,只要在User表中的addresses欄位上添加uselist=False就可以達到一對一的效果。設置了一對一的效果後,就不能添加多個郵箱到user.addresses欄位了,只能添加一個:
3. 多對多:多對多需要一個中間表來作為連接,同理在sqlalchemy中的orm也需要一個中間表。假如現在有一個Teacher和一個Classes表,即老師和班級,一個老師可以教多個班級,一個班級有多個老師,是一種典型的多對多的關係,那麼通過sqlalchemy的ORM的實現方式如下:
要創建一個多對多的關係表,首先需要一個中間表,通過Table來創建一個中間表。上例中第一個參數teacher_classes代表的是中間表的表名,第二個參數是Base的元類,第三個和第四個參數就是要連接的兩個表,其中Column第一個參數是表示的是連接表的外鍵名,第二個參數表示這個外鍵的類型,第三個參數表示要外鍵的表名和欄位。 創建完中間表以後,還需要在兩個表中進行綁定,比如在Teacher中有一個classes屬性,來綁定Classes表,並且通過secondary參數來連接中間表。同理,Classes表連接Teacher表也是如此。定義完類後,之後就是添加數據,請看以下示例:
關注+轉發感謝大家


※十張圖讀懂 PHP、Python、Ruby 三大語言的差異
※為啥我的Python這麼慢(一)
※盛思PythonEditor離線版升級microbit模擬功能!
※Python批量修改Excel文件格式:加粗、顏色交替、漸變背景色填充
※使用Python探索二手車市場
TAG:python |