복붙노트

[PYTHON] WHERE를 사용하여 SQLAlchemy Core의 일괄 업데이트

PYTHON

WHERE를 사용하여 SQLAlchemy Core의 일괄 업데이트

필자는 SQLAlchemy의 대량 삽입 작업을 다음과 같이 처리했습니다.

conn.execute(addresses.insert(), [ 
   {'user_id': 1, 'email_address' : 'jack@yahoo.com'},
   {'user_id': 1, 'email_address' : 'jack@msn.com'},
   {'user_id': 2, 'email_address' : 'www@www.org'},
   {'user_id': 2, 'email_address' : 'wendy@aol.com'},
])

지금 필요한 것은 업데이트와 비슷한 것입니다. 나는 이것을 시도했다.

conn.execute(addresses.insert(), [ 
   {'user_id': 1, 'email_address' : 'jack@yahoo.com', 'id':12},
   {'user_id': 1, 'email_address' : 'jack@msn.com', 'id':13},
   {'user_id': 2, 'email_address' : 'www@www.org', 'id':14},
   {'user_id': 2, 'email_address' : 'wendy@aol.com', 'id':15},
])

'id'필드에 따라 각 행이 업데이트되지만 작동하지 않습니다. WHERE 절을 지정하지 않았으므로 가정합니다. 그러나 사전에 포함 된 데이터를 사용하여 WHERE 절을 지정하는 방법을 알지 못합니다.

누군가 나를 도울 수 있습니까?

해결법

  1. ==============================

    1.문서의 삽입, 업데이트 및 삭제 섹션을 읽으십시오. 다음 코드를 시작해야합니다.

    문서의 삽입, 업데이트 및 삭제 섹션을 읽으십시오. 다음 코드를 시작해야합니다.

    from sqlalchemy.sql.expression import bindparam
    stmt = addresses.update().\
        where(addresses.c.id == bindparam('_id')).\
        values({
            'user_id': bindparam('user_id'),
            'email_address': bindparam('email_address'),
        })
    
    conn.execute(stmt, [
        {'user_id': 1, 'email_address' : 'jack@yahoo.com', '_id':1},
        {'user_id': 1, 'email_address' : 'jack@msn.com', '_id':2},
        {'user_id': 2, 'email_address' : 'www@www.org', '_id':3},
        {'user_id': 2, 'email_address' : 'wendy@aol.com', '_id':4},
    ])
    
  2. ==============================

    2.Flask Session은 bulk_insert_mappings 및 bulk_update_mappings 함수를 가지고 있습니다. 여기를 확인하십시오.

    Flask Session은 bulk_insert_mappings 및 bulk_update_mappings 함수를 가지고 있습니다. 여기를 확인하십시오.

    매핑시 기본 키를 제공해야한다는 점에 유의하십시오.

    # List of dictionary including primary key
    user_mappings = [{
        'user_id': 1, # This is pk?
        'email_address': 'jack@yahoo.com',
        '_id': 1
    }, ...]
    
    session.bulk_update_mappings(User, user_mappings)
    session.commit()
    
  3. from https://stackoverflow.com/questions/25694234/bulk-update-in-sqlalchemy-core-using-where by cc-by-sa and MIT license