Postgresql

如何批量插入 sqlalchemy 子類

  • August 8, 2019

我正在嘗試將 SQL-Alchemy 子類批量插入父表及其各自的表,即水果表 - > Apple 表,所以我插入了一個 APPLE 表,它會將這兩行都插入到 fruits 表中,然後給我 id水果表中的行並將其放入 Apple 這在一次插入一行時有效,但由於性能原因,我需要它與批量插入一起使用

我嘗試批量插入失敗,我嘗試了單行插入,它適用於單行插入,但問題是除了自動生成的行的 id 之外,這些數據並不是真正唯一的,所以它真的很難對父表進行批量插入,然後對數據匹配的子類表進行批量插入,並通過映射函式使用 id

           for data in apple_list:
               db.session.add(Apple(
                   brand=data["brand"],
                   picked_date=data["picked_date"],
                   type=data["type"],
                   color=data["color"],
                   sub_type=data["sub_type"],
               ))

我想要的是更像批量插入的東西

         db.session.bulk_insert_mappings(model_classes['Apple'], apple_list)

實際結果是,當它嘗試插入時,由於它沒有將水果表的行告訴蘋果表的外主鍵,因此在插入時出錯

期望插入沒有任何錯誤並填充兩個表,就像插入兩行時一樣

我想通了,所以 SQLALCHEMY 在批量插入映射中有一個參數,稱為return_defaults

警告這直接來自文件return_defaults - 當為 True 時,缺少生成預設值的值的行,即整數主鍵預設值和序列,將一次插入一個,以便主鍵值可用。特別是這將允許連接繼承和其他多表映射正確插入,而無需提前提供主鍵值;但是, Session.bulk_insert_mappings.return_defaults 大大降低了該方法的整體性能增益。如果要插入的行僅引用單個表,則沒有理由設置此標誌,因為不使用返回的預設資訊。

那麼你所要做的就是這個

db.session.bulk_insert_mappings(model_classes['Apple'], apple_list, return_defaults=True) 

它仍然比db.session.add

引用自:https://dba.stackexchange.com/questions/243704