如何使用Bookshelf / Knex在Postgres中插入/更新`ARRAY`列

时间:2017-06-22 22:15:26

标签: node.js postgresql knex.js bookshelf.js

我的Postgres数据库中有一个表,其中包含一个数据类型为ARRAY的列。我正在使用Bookshelf对数据库执行操作。现在,我想在此列中插入/更新(将新数据附加到数组中的先前数据)数据,但我找不到这样做的方法。任何人都可以指导我如何实现这一目标吗? 我认为,这样做的一种方法可能是使用Knex的raw()功能,但我不确定如何使用raw()功能,所以请指导我。 感谢。

3 个答案:

答案 0 :(得分:1)

我找到了解决此问题的方法here。看来BookshelfJS没有办法处理这样的操作,所以我不得不使用KnexJS。我实现了类似的东西 -

knex('users')                               //users table
        .where('id', id)
        .update({
            array_column_name: knex.raw('array_append(array_column_name, ?)', [data_to_append])
        })
        .then(function (user) {
            //Do something 
        });

希望这有助于将来的其他人。

答案 1 :(得分:0)

假设有以下表格架构

CREATE TABLE test (id SERIAL PRIMARY KEY, data TEXT[] NOT NULL);

带示例数据

INSERT INTO test (data) VALUES (array[ 'def', 'ghi' ]);

可以像

一样查询
SELECT * FROM test ;
 id |   data    
----+-----------
  1 | {def,ghi}

您可以array functions使用array_prepend( 'abc', array )array_append( array, 'xyz' )这样

UPDATE test SET data = array_prepend( 'abc', data );
UPDATE test SET data = array_append( data, 'xyz' );

获取

SELECT * FROM test;
id  |       data        
----+-------------------
  1 | {abc,def,ghi,xyz}

您应该知道data列不是原子的,因此此表架构不符合第一范式(违反1NF)。过滤掉data列中的值会更加困难。例如,您不能轻易使用WHERE子句。考虑调整表模式以至少遵守1NF,更好的3NF。

答案 2 :(得分:0)

UPDATE tableName SET ColumnName = array_prepend('Value',ColumnName) WHERE ColumnName ='Value'

更新tblTest SET TestColumnName = array_prepend('TestData',TestColumnName) 在哪里TestColumnId ='1'