Добавьте отсутствующий ключ в JSON в таблице Postgres через Rails - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь использовать update_all для обновления любых записей, в которых отсутствует ключ в JSON, хранящемся в ячейке таблицы.ids это идентификаторы этих записей, и я попробовал следующее ...

User.where(id: ids).
  update_all(
    "preferences = jsonb_set(preferences, '{some_key}', 'true'"
  )

Где возвращается ошибка ...

Caused by PG::SyntaxError: ERROR:  syntax error at or near "WHERE"
LINE 1: ...onb_set(preferences, '{some_key}', 'true' WHERE "user...

Ключ принимает строкузначение, поэтому не уверен, почему запрос не выполняется.

ОБНОВЛЕНИЕ:

Основываясь на том, что было упомянуто, я добавил скобки, а также добавил / изменил последние два аргумента...

User.where(id: ids).
  update_all(
    "preferences = jsonb_set(preferences, '{some_key}', 'true'::jsonb, true)"
  )  

все еще возникают проблемы, и на этот раз кажется, что они связаны с ключом, который я передаю

  1. Я знаю, что этот ключ в настоящее время не существует длянабор идентификаторов

  2. Я добавил true для create_missing, чтобы 1 не было проблемой

Я получил этоошибка сейчас ...

Caused by PG::UndefinedFunction: ERROR:  function jsonb_set(hstore, unknown, jsonb, boolean) does not exis

some_key должно быть ключом preferences

1 Ответ

0 голосов
/ 24 мая 2019

Вы передаете необработанный SQL, поэтому вы на 100% ответственны за то, чтобы убедиться, что это действительно допустимый SQL. Что у вас там нет Проверьте свои скобки:

User.where(id: ids).
update_all(
  "preferences = jsonb_set(preferences, '{some_key}', 'true')"
)

Если вы посмотрите более внимательно на сообщение об ошибке, оно сообщало вам, что возникла проблема именно при введении предложения WHERE и сразу после ...true', так что это было хорошее место для поиска проблем.

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

...