[英]How to create a column that can store an array of objects using knex/postgres
[英]How to insert/update `ARRAY` column in Postgres using Bookshelf/Knex
我的 Postgres 数据库中有一个表,其中包含一个数据类型为ARRAY
的列。 我正在使用 Bookshelf 对数据库执行操作。 现在,我想在此列中插入/更新(将新数据附加到数组中的先前数据)数据,但我找不到执行此操作的方法。 有人可以指导我如何实现这一目标吗? 我认为,这样做的一种方法可能是使用 Knex 的raw()
函数,但我不确定如何使用raw()
函数,所以也请指导我。 谢谢。
我在这里找到了这个问题的解决方案。 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
});
希望这对将来的其他人有所帮助。
假设下表架构
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_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。
UPDATE tableName SET ColumnName = array_prepend( 'Value', ColumnName) WHERE ColumnName = 'Value' UPDATE tblTest SET TestColumnName = array_prepend( 'TestData', TestColumnName) WHERE TestColumnId = '1'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.