Как увеличить несколько строк с помощью SqlAlchemy - PullRequest
0 голосов
/ 04 августа 2020

Как обновить несколько записей с приращением некоторого поля (в моем случае id)? Я пропустил одну запись, и вся таблица сместилась.

Как это сделать в одной транзакции или в одном запросе? Или как это сделать быстрее всего?

Пробовал что-то вроде ниже, но это слишком медленно.

rows = session.query(Table).all()
for row in rows:
    row.id = row.id + 1
    session.commit()

Также пытался использовать что-то вроде, но у меня это не работает:

session.query(Table)\
    .filter(Table.id == row.id)\
    .update({'id': row.id + 1})

Пример данных, которые у меня есть:

 ID   Value 
  1       A
  2       B
  3       C
               < -- D is missing here
  4       E
  5       F

Здесь, если это будет алфавит, D должен иметь ID = 4, тогда мне нужно увеличить E и F.

Это не сложно, когда у вас есть 5 записей, но проблема возникает, когда у вас есть миллионы или миллиарды записей с этой проблемой.

1 Ответ

1 голос
/ 04 августа 2020

Чтобы вставить документ внутри последовательности, Я вручную создал столбец new_id и добавил его в Table модель

new_object_id = 4

session.query(Table) \
    .filter(Table.id < new_object_id)\
    .update({Table.new_id: Table.id})

session.query(Table) \
    .filter(Table.id >= new_object_id)\
    .update({Table.new_id: Table.id + 1})

После этих действий вы должны увидеть «дыру» в id-последовательности.

Затем , в отдельных запросах, вручную переименованные столбцы id -> old_id и new_id -> id. Обновлен вновь «созданный» столбец id со всеми атрибутами (первичный ключ, уникальный и т. Д. c.). Отброшен столбец old_id.

И, наконец, вставлена ​​необходимая строка.

Общее время - несколько минут вместо нескольких дней.

Найдено решение, которое работает для меня самого. Если кто-то знает, как оптимизировать ручные шаги - вы можете добавлять комментарии или редактировать этот ответ.

...