2
CREATE TYPE phototable AS (
    photoid integer,
    parentid integer,
    fileextension character varying(20),
    description text,
    tag character varying(100)
);

CREATE FUNCTION addphotos(
          p_placeid integer
        , p_permissiontypeid integer
        , p_description text DEFAULT NULL::text
        , p_photos phototable[] DEFAULT NULL::phototable[]) 

BEGIN
........
END

我通过生成 SQL 查询从 node.js(使用 node-postres)调用此函数。我想避免它并想使用参数化查询,因为我认为它对 SQL 注入攻击不安全。我找不到将自定义类型数组传递给 node-postgres 的查询方法的方法。有没有办法将自定义类型数组传递给 node-postgres 的查询函数?

询问:

select * from addphotos(p_placeid:=2210, p_permissiontypeid:=2, p_description:='Party', 
p_photos:=array[row(null, null,'.JPG','smart','6e8f74b2-4c14-4f40-ae19-8abae026a539'),
row(null, null,'.JPG',null,'c4e9f75f-25fa-4893-82f1-44c4791d58e5')]::phototable[]);
4

1 回答 1

3

我不熟悉 node.js,但是您可以为您的列提供一个字符串文字p_photos,而不是ARRAYandROW构造函数(它们是需要在 Postgres 端执行的函数!)。您的查询将如下所示:

SELECT * FROM addphotos(
    p_placeid := 2210
  , p_permissiontypeid := 2
  , p_description := 'Party'
  , p_photos:='{"(,,.JPG,smart,6e8f74b2-4c14-4f40-ae19-8abae026a539)"
               ,"(,,.JPG,,c4e9f75f-25fa-4893-82f1-44c4791d58e5)"}'::phototable[]
    );

甚至应该在没有明确演员表的情况下工作:

SELECT * FROM addphotos(
    p_placeid := 2210
  , p_permissiontypeid := 2
  , p_description := 'Party'
  , p_photos:='{"(,,.JPG,smart,6e8f74b2-4c14-4f40-ae19-8abae026a539)"
               ,"(,,.JPG,,c4e9f75f-25fa-4893-82f1-44c4791d58e5)"}'
    );

将语法“重写”为字符串文字的快速而简单的方法:让 Postgres 来做:

SELECT array[row(null, null,'.JPG','smart','6e8f74b2-4c14-4f40-ae19-8abae026a539'),
             row(null, null,'.JPG',null,'c4e9f75f-25fa-4893-82f1-44c4791d58e5')]::phototable[]

返回我上面使用的字符串表示:

于 2013-12-04T20:17:30.247 回答