如何使用knexjs,bookshelfjs更新JSONB列

时间:2017-10-10 14:37:12

标签: postgresql jsonb knex.js bookshelf.js

我在PostgreSQL数据库中有一个JSONB列,如{lat: value, lon: value}。我想一次更改任何特定值,例如。 lat,但我不知道如何使用bookshelf.js或knex.js实现这一目标。我尝试使用Postgres文档中指定的jsonb_set()方法,但我不确定我是否正确使用了它。有人可以建议我怎么做?或者这样做的正确语法是什么?感谢。

2 个答案:

答案 0 :(得分:1)

支持在postgresql jsonb列中写入和提取数据的AFAIK唯一基于knex的东西是objection.js ORM。

使用普通的knex,您需要使用raw来编写引用:

knex('table').update({
  jsonbColumn: knex.raw(`jsonb_set(??, '{lat}', ?)`, ['jsonbColumn', newLatValue])
})

您可以在https://runkit.com/embed/44ifdhzxejf1

检查生成的SQL

最初回答:https://github.com/tgriesser/knex/issues/2264

如何将jsonb_set与knex一起使用的更多示例可以在以下答案中找到

How to update a jsonb column's field in PostgreSQL?

What is the best way to use PostgreSQL JSON types with NodeJS

答案 1 :(得分:0)

使用knex.js更新Jsonb字段

 delete(id, files){

    return new Promise((resolve, reject)=>{

        conn.query(`
            DELETE FROM tb_menus WHERE id = ? and photo = ?
        `, [
            id, files.photo.name
        ], (err, results)=>{


            if(err){

                reject(err);
                

            } else {

                //fs.unlink(`images/${path.parse(photo).base}`);
                resolve(results);
                //console.log(results);

            }

        });

    });

}

return knex("tablename").update({ jsonbkey: knex.raw(` jsonb_set(jsonbkey, '{city}','"Ayodhya"') `) }).where({"id" :2020}) 将是列名,数据类型为jsonb。

jsonbkey是表的名称。

tablename是对象键。

如果存在多个级别的对象,则可以使用点。像city