Node.js 如何使用Bookshelf/Knex在Postgres中插入/更新'ARRAY'列

Node.js 如何使用Bookshelf/Knex在Postgres中插入/更新'ARRAY'列,node.js,postgresql,knex.js,bookshelf.js,Node.js,Postgresql,Knex.js,Bookshelf.js,我的Postgres数据库中有一个表,其中包含一个数据类型为数组的列。我正在使用Bookshelf对数据库执行操作。现在,我想在此列中插入/更新(将新数据附加到数组中以前的数据中)数据,但我找不到执行此操作的方法。有人能指导我如何做到这一点吗? 我想,一种方法是使用Knex的raw()函数,但我不确定如何使用raw()函数,所以请也指导我。 谢谢。假设下表模式 CREATE TABLE test (id SERIAL PRIMARY KEY, data TEXT[] NOT NULL); 带示

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

假设下表模式

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}
您可以像这样使用to
array\u prepend('abc',array)
array\u 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)。从
数据
列中筛选出值将更加困难。例如,您不能轻易地使用
WHERE
子句。考虑将表模式调整为1nf,最好是3nf。

我找到了这个问题的解决方案。BookshelfFJS似乎没有处理此类操作的方法,所以我不得不使用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 
        });
希望这对以后的其他人有所帮助。

更新tableName SET ColumnName=array\u prepend('Value',ColumnName) 其中ColumnName='Value'

更新tblTest 设置TestColumnName=array_prepend('TestData',TestColumnName)
其中TestColumnId='1'

感谢您的回复。我知道这些
数组函数
,但我想用BookshelfJS和KnexJS实现这一点。你能给我介绍一下吗?