Как преобразовать данные в столбце JSONB в отдельные столбцы для миллионов строк в Rails / Postgres? - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть столбец JSONB в Postgres, и мне нужно разбить данные JSONB на отдельные столбцы. У меня настроены все новые столбцы, но теперь у меня есть около 3 миллионов записей, данные JSONB которых нужно разбить на отдельные столбцы.

Какой самый эффективный способ в основном запустить UPDATE на каждая строка?

Прямо сейчас я делаю это в рамках рейк-задачи Rails:

Track.all.find_each do |track|
  track.update_attributes(
    key: track.audio_features['key'],
    mode: track.audio_features['mode'],
    tempo: track.audio_features['tempo'],
    energy: track.audio_features['energy'],
    valence: track.audio_features['valence'],
    liveness: track.audio_features['liveness'],
    loudness: track.audio_features['loudness'],
    speechiness: track.audio_features['speechiness'],
    acousticness: track.audio_features['acousticness'],
    danceability: track.audio_features['danceability'],
    time_signature: track.audio_features['time_signature'],
    instrumentalness: track.audio_features['instrumentalness'],
  )
end

Это ... потребуется 3 миллиона строк. Есть ли более быстрый способ сделать это?

1 Ответ

3 голосов
/ 06 февраля 2020

Я бы сделал это с SQL напрямую, вместо создания всего в Ruby. Это не будет запускать проверки или обратные вызовы, которые будут иметь ваши модели Ruby, поэтому будет немного более опасным, но это будет намного быстрее.

Синтаксис SQL будет выглядеть примерно так:

UPDATE tracks 
SET key = audio_features->>'key',
  mode = audio_features->>'mode',
  energy = audio_features->>'energy',
  valence = audio_features->>'valence',
  liveness = audio_features->>'liveness',
  loudness = audio_features->>'loudness',
  speechiness = audio_features->>'speechiness',
  acousticness = audio_features->>'acousticness',
  danceability = audio_features->>'danceability',
  time_signature = audio_features->>'time_signature',
  instrumentalness = audio_features->>'instrumentalness';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...