首頁 >資料庫 >mysql教程 >如何在 SQLAlchemy 中實作 INSERT ... ON DUPLICATE KEY UPDATE 功能?

如何在 SQLAlchemy 中實作 INSERT ... ON DUPLICATE KEY UPDATE 功能?

Susan Sarandon
Susan Sarandon原創
2024-11-23 21:21:12234瀏覽

How Can I Achieve INSERT ... ON DUPLICATE KEY UPDATE Functionality in SQLAlchemy?

SQLAlchemy 中的優雅ON DUPLICATE KEY UPDATE

SQLAlchemy 缺乏使用以下指令執行「INSERT: ON DUPLICATEEY.無縫解決方案它的ORM 層。但是,有一些解決方法可以實現類似的功能。

內建 MySQL 支援

對於 MySQL 資料庫,SQLAlchemy 現在提供對 ON DUPLICATE KEY UPDATE 的內建支援。這可以使用以下語法來實現:

inserter = my_table.insert()
inserter.execute(list_of_dictionaries)

參數化 ON DUPLICATE KEY UPDATE

在為其他物件產生的 SQL 語句中包含 ON DUPLICATE KEY UPDATEICATE KEY UPDATE子句資料庫,您可以使用裝飾器來附加所需的string:

@compiles(Insert)
def append_string(insert, compiler, **kw):
    s = compiler.visit_insert(insert, **kw)
    if 'append_string' in insert.kwargs:
        return s + " " + insert.kwargs['append_string']
    return s

my_connection.execute(my_table.insert(append_string = 'ON DUPLICATE KEY UPDATE foo=foo'), my_values)

主鍵的ORM 功能

對於唯一鍵為主鍵的ORM 對象,可以使用SQLAlchemy 的session.merge()函數複製重複密鑰更新功能:

session.merge(ModelObject)

非主鍵的自訂實作

對於非主鍵唯一約束,可以建立一個類似Django 的get_or_create( ) 的自訂函數來實現期望的行為:

def get_or_create(session, model, defaults=None, **kwargs):
    instance = session.query(model).filter_by(**kwargs).first()
    if instance:
        return instance
    else:
        params = {k: v for k, v in kwargs.items() if not isinstance(v, ClauseElement)}
        if defaults:
            params.update(defaults)
        instance = model(**params)
        return instance

以上是如何在 SQLAlchemy 中實作 INSERT ... ON DUPLICATE KEY UPDATE 功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn