Подтвердить что ты не робот

Массовое обновление в SQLAlchemy Core с использованием WHERE

Мне удалось работать с объемной вставкой в ​​SQLAlchemy, например:

conn.execute(addresses.insert(), [ 
   {'user_id': 1, 'email_address' : '[email protected]'},
   {'user_id': 1, 'email_address' : '[email protected]'},
   {'user_id': 2, 'email_address' : '[email protected]'},
   {'user_id': 2, 'email_address' : '[email protected]'},
])

Теперь мне нужно что-то эквивалентное для обновления. Я пробовал это:

conn.execute(addresses.insert(), [ 
   {'user_id': 1, 'email_address' : '[email protected]', 'id':12},
   {'user_id': 1, 'email_address' : '[email protected]', 'id':13},
   {'user_id': 2, 'email_address' : '[email protected]', 'id':14},
   {'user_id': 2, 'email_address' : '[email protected]', 'id':15},
])

ожидает, что каждая строка обновится в соответствии с полем "id", но это не сработает. Я предполагаю, что это потому, что я не указал предложение WHERE, но я не знаю, как указать предложение WHERE, используя данные, которые включены в словарь.

Может кто-нибудь мне помочь?

4b9b3361

Ответ 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' : '[email protected]', '_id':1},
    {'user_id': 1, 'email_address' : '[email protected]', '_id':2},
    {'user_id': 2, 'email_address' : '[email protected]', '_id':3},
    {'user_id': 2, 'email_address' : '[email protected]', '_id':4},
])

Ответ 2

Flask Session имеет функцию под названием bulk_insert_mappings и bulk_update_mappings. проверьте здесь.

Имейте в виду, что вы должны предоставить первичный ключ в сопоставлениях

# List of dictionary including primary key
user_mappings = [{
    'user_id': 1, # This is pk?
    'email_address': '[email protected]',
    '_id': 1
}, ...]

session.bulk_update_mappings(User, user_mappings)
session.commit()