2017-06-22 119 views
1

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

回答

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 
     }); 

希望这可以帮助其他人在未来。

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 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列不是原子,因此该表架构不符合第一范式(1NF违规的)。过滤掉data列中的值会更困难。例如,您不能轻松使用WHERE子句。考虑调整表格模式以坚持1NF,至少3NF更好。

+0

感谢您的回复。我知道这些“数组函数”,但我想使用BookshelfJS和KnexJS来实现这一点。你能指导我吗? –