我有一个postgres功能:
CREATE OR REPLACE FUNCTION add_new_views(VARIADIC all_view event_view[]) RETURNS void AS $BODY$ DECLARE view event_view; BEGIN FOREACH view IN ARRAY all_view LOOP INSERT INTO t_event_views VALUES (view.event_id,view.device_code); END LOOP; END; $BODY$
event_view – 这是我的复合类型:
CREATE TYPE event_view (event_id uuid,device_code text);
我可以通过pgAdmin使用我的函数,如下所示:
SELECT add_new_views(VARIADIC ARRAY [ ('b9d78fc3-b55a-452e-b935-8ce4f1e79284','asd')::event_view,('b9d78fc3-b55a-452e-b935-8ce4f1e79284','asd')::event_view ]);
但我需要从nodejs调用它.要连接postgresql我使用node-postgres ‘pg’模块.
我发送此请求:
query = 'SELECT add_new_views(VARIADIC [$1])'; current_client.query(query,allViews,function(err,res) { if(err) console.log(err); console.log(res) })
allViews – 数组如下所示:
[ [ '(b9d78fc3-b55a-452e-b935-8ce4f1e79284)','(CHUPERM)' ],[ '(b9d78fc3-b55a-452e-b935-8ce4f1e79284)','(HUE)' ],'(HU)' ],[ '(00ae9a6c-781f-48d1-ab42-bfa87d09bdbb)','(HITE)' ],'(HIJFIRM)' ],'(DVERMNYEZAPILI)' ],'(TICHTOMENYANEVIDISH)' ],'(HITEBEAD)' ] ]
作为回应,我得到:
{ [error: malformed record literal: "(b9d78fc3-b55a-452e-b935-8ce4f1e79284)"] name: 'error',length: 133,severity: 'ERROR',code: '22P02',detail: 'Too few columns.',hint: undefined,position: undefined,internalPosition: undefined,internalQuery: undefined,where: undefined,schema: undefined,table: undefined,column: undefined,dataType: undefined,constraint: undefined,file: 'rowtypes.c',line: '183',routine: 'record_in' }
如果从元素allView数组中删除括号,我收到错误“等待括号”.
当我尝试传递给postgres简单的一维数组时,一切都很好(我改变了postgre函数中所需的一切).但是使用这种复合型数组我什么也做不了.请帮忙.对不起,我的英语不好.
解决方法
答案可能很晚,但解决了这个问题.
node-postgres需要的正确语法是:
[ '(b9d78fc3-b55a-452e-b935-8ce4f1e79284,CHUPERM)','(b9d78fc3-b55a-452e-b935-8ce4f1e79284,HUE)',... ]
不需要二维数组,而是需要一维数组中的行的字符串表示.