Миграция с номера c ID на UUID - PullRequest
0 голосов
/ 24 февраля 2020

Я ищу любые советы и предложения по переходу с числовых идентификаторов c на идентификаторы UUID в Экто.

У меня есть проект с большим количеством отношений, и я я не могу просто сбросить БД и воссоздать его с UUID, что кажется самым простым решением, потому что я должен сохранить данные.

Моя идея была:

  1. Добавить :uuid, :uuid поле для таблицы

  2. Заполните столбец :uuid скриптом и Ecto.UUID.generate()

  3. Измените таблицу на (:some_table, primary_key: false) и введите в поле: :uuid, :uuid, primary_key: true и удалите поле :id.

  4. Переименуйте поле :uuid в :id

Хотя это выглядело идеально в моем уме, я, конечно, забыл о ссылках. Есть ли способ, с помощью которого я могу легко справиться со ссылками с нумерации c ID на UUID? Единственная идея, которая приходит мне в голову, - создать дополнительную таблицу, которая будет содержать старый идентификатор и новый UUID между 2-м и 3-м шагом, затем удалить старые ссылки и добавить новые на основе созданной таблицы. Буду признателен за любые предложения:)

1 Ответ

0 голосов
/ 24 февраля 2020

Если у вас есть возможность перевести БД в состояние только для чтения извне, это не должно быть слишком сложно. Я не уверен, что он будет работать должным образом с новыми записями, возникающими во время обновления.

0 . Отбросьте все ограничения внешнего ключа

1 . Добавьте :uuid, :uuid поле в таблицу
2 . Измените таблицу на primary_key: false
3 . Установите триггер на UPDATE, обновляя все значения fk в соответствующих таблицах до вставленного значения
4 . Заполните столбец :uuid процедурой DB, например gen_uuid()
5 . Сделайте :uuid первичным ключом (и удалите :id) 6 . Переименуйте поле :uuid в :id

. Поместите все внешние ключи обратно на место.

Все это лучше сделать с чистым SQL (за исключением обновление схемы.)

...