2017-09-27 52 views
0

在db中,我有一個名爲register的表,它具有mail-id作爲主鍵。我曾經使用session.add_all()批量提交。但有時候有些記錄已經存在;在這種情況下,我想分開已有的記錄和不存在的記錄。如何檢查一個查詢中的主鍵列表是否已經存在於數據庫中?

+0

您使用了哪些數據庫? –

+0

我正在使用Postgres – katrik

+0

您可以利用新的[INSERT ... ON CONFLICT DO NOTHING](http://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#insert-on-conflict-upsert )至少在那裏獲取數據。如果你使用的是足夠近的Postgres,那就是。 –

回答

-1

用戶SQL ALchemys檢查此:

inspector = inspect(engine) 
inspector.get_primary_keys(table, schema) 

督察「反映」所有的主鍵,你可以檢查安劍錚,卓傑返回列表。

+0

我認爲他們之後是一種批量插入的形式,可以跳過現有的鍵而不是失敗。他們似乎知道主鍵由哪些列組成(「mail-id」)。 –

1

http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session.merge

如果你要添加到數據庫中的對象是完整的(如新對象至少包含了所有在數據庫中的記錄中存在的信息),可以使用Session.merge()。有效地,merge()將創建或更新現有行(通過查找主鍵(如果它存在於會話/數據庫中並從對象中複製對象的狀態)。需要注意的關鍵是傳遞給合併的對象的屬性值將覆蓋數據庫中已存在的屬性值。

我認爲這在性能方面並不是很好,所以如果這很重要,SQLAlchemy會有一些批量操作。您需要檢查將要添加/更新的主鍵集的存在性,併爲不存在的對象執行一個批量插入操作,併爲所做的操作執行一次批量更新。如果文檔需要成爲高性能的方法,那麼這些文檔會提供關於批量操作的一些信息。

http://docs.sqlalchemy.org/en/latest/orm/persistence_techniques.html#bulk-operations

+0

嗨Rach,合併將爲我工作的方式,但我也想獲得哪些主鍵已經存在的優化方式。 – katrik

相關問題