如何使用 Bookshelf/Knex 在 Postgres 中 insert/update `ARRAY` 列

How to insert/update `ARRAY` column in Postgres using Bookshelf/Knex

我的 Postgres 数据库中有一个 table,其中包含一个数据类型为 ARRAY 的列。我正在使用 Bookshelf 对数据库执行操作。现在,我想 insert/update(将新数据附加到数组中的先前数据)数据,但我找不到执行此操作的方法。谁能指导我如何实现这一目标? 我认为,一种方法是使用 Knex 的 raw() 函数,但我不确定如何使用 raw() 函数,因此也请指导我。 谢谢。

假设以下 table 架构

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 functionsarray_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 列不是原子的,因此这个 table 模式不符合第一范式(违反 1NF)。从 data 列中过滤掉值会更加困难。例如,您不能轻易使用 WHERE 子句。考虑调整 table 架构以遵守 1NF,至少更好的 3NF。

我找到了这个问题的解决方案 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 
        });

希望这对以后的其他人有所帮助。

更新表名 SET ColumnName = array_prepend( 'Value', ColumnName) 其中 ColumnName = 'Value'

更新 tblTest SET 测试列名 = array_prepend( 'TestData', 测试列名) WHERE TestColumnId = '1'