>데이터 베이스 >MySQL 튜토리얼 >SQLAlchemy를 사용하여 중복 키 업데이트 시 INSERT ...를 효율적으로 사용하려면 어떻게 해야 합니까?

SQLAlchemy를 사용하여 중복 키 업데이트 시 INSERT ...를 효율적으로 사용하려면 어떻게 해야 합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-24 10:31:11323검색

How Can I Efficiently Use INSERT ... ON DUPLICATE KEY UPDATE with SQLAlchemy?

SQLAlchemy를 사용한 우아한 ON 중복 키 업데이트

질문: INSERT를 실행하는 원활한 방법이 있습니까? 다음과 유사한 구문을 사용하여 SQLAlchemy에서 ON DUPLICATE KEY UPDATE inserter.insert().execute(list_of_dictionaries)?

정답:

MySQL용 내장 기능(버전 1.2 기준)

특히 MySQL의 경우 SQLAlchemy에는 이제 ON에 대한 지원이 포함됩니다. DUPLICATE KEY UPDATE.

SQL 문의 ON DUPLICATE KEY UPDATE

생성된 SQL에 ON DUPLICATE KEY UPDATE를 명시적으로 포함하려면 @compiles 데코레이터를 사용할 수 있습니다.

from sqlalchemy.ext.compiler import compiles
from sqlalchemy.sql.expression import Insert

@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의 ON DUPLICATE KEY UPDATE 기능

SQLAlchemy에는 ON DUPLICATE KEY UPDATE 또는 MERGE에 대한 명시적인 ORM 지원이 없지만 세션이 있습니다. .merge() 함수. 그러나 이 기능은 기본 키에만 유효합니다.

기본 키가 아닌 키에 대해 ON DUPLICATE KEY UPDATE 기능을 시뮬레이션하려면 다음과 같은 기능을 구현할 수 있습니다.

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

위 내용은 SQLAlchemy를 사용하여 중복 키 업데이트 시 INSERT ...를 효율적으로 사용하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.