Как сделать PostgreSQL '||'оператор с knex.update - PullRequest
0 голосов
/ 24 октября 2018

Я работаю со следующими данными в таблице my_table:

[
  {
    "item": {
      "id": 1,
      "data": {
        "name": "ABC",
        "status": "Active"
      }
    }
  },
  {
    "item": {
      "id": 2,
      "data": {
        "name": "DEF",
        "status": "Active"
      }
    }
  }
]

Я хотел бы обновить свойство name для data, сохранив остальную часть data без изменений.Запрос PostgreSQL для этой цели будет выглядеть следующим образом:

UPDATE my_table SET data = data || '{"name":"GHI"}' WHERE id = 1;

Однако я пытаюсь добиться этого с помощью knex, как я пытался:

knex('my_table')
.update({ data: knex.raw('data || ?', [{ name: 'GHI' }]) })
.where('id', 1);

и многих других подобныхзапросы, но зря.Если у вас есть идеи по этому поводу, пожалуйста, поделитесь ими ниже.Заранее спасибо!

1 Ответ

0 голосов
/ 30 октября 2018

Используя knex, вам действительно нужно использовать необработанные выражения для обновления одного поля внутри столбца JSONB.

Однако в objection.js, который представляет собой ORM, построенный поверх knex, есть некоторая дополнительная поддержкаОперации JSONB.

При objection.js ваше обновление будет выглядеть как

await MyTableModel.query(knex).update({'data:name', 'GHI'}).where('id', 1);

, которое выводит SQL следующим образом (с привязками ["GHI", 1]):

update "my_table" set "data" = jsonb_set("data", '{name}', ?, true) where "id" = ?

Пример Runkit https://runkit.com/embed/0dai0bybplxv

...