如何使用 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 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
列不是原子的,因此这个 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'
我的 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 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
列不是原子的,因此这个 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'