我想在一次批量操作中插入多达100个项目。我是这样做的:
INSERT INTO MyTable (f1, f2, ..., fk) VALUES
(v11, v12, ..., v1k),
(v21, v22, ..., v2k),
...
(vn1, vn2, ..., vnk)
一切都很好,但是我通过按原样连接值来构建这个字符串,这意味着我的代码容易受到SQL注入。
如何一方面继续使用批量插入语法,还要保护其免受SQL注入?
编辑1
我想提供更多背景信息。我将要使用的实际SQL(此时编写代码)具有以下形式:
WITH new_parent AS (
INSERT into parent (g1, g2, ..., gm) VALUES (v1, v2, ..., vm) RETURNING id
) INSERT INTO MyTable (parent_id, f1, f2, ..., fk) VALUES
(new_parent.id, v11, v12, ..., v1k),
(new_parent.id, v21, v22, ..., v2k),
...
(new_parent.id, vn1, vn2, ..., vnk)
答案 0 :(得分:1)
使用COPY声明 - 如果可能的话。它更快一点,需要更少的内存,并且它是SQL注入防弹 - 因为数据使用不同的通道。
答案 1 :(得分:0)
您可以构建一个连接的参数字符串而不是实际值,然后使用单个数组传递这些值,其中包括按正确顺序排列的所有值。例如:
CREATE TYPE paramValues AS {
"ID" integer,
"V1" text
.
.
.
}
CREATE OR REPLACE FUNCTION bulk(data paramValues[])
RETURNS integer AS
$BODY$
DECLARE
BEGIN
WITH new_parent AS (
INSERT into parent (g1, g2, ..., gm) VALUES (v1, v2, ..., vm) RETURNING id
) INSERT INTO MyTable (parent_id, f1, f2, ..., fk) VALUES
($1, $2, $3, ..., $k),
($k+1, $k+2, $k+3, ..., $k+k),
...
($m, $m+1, $m+2, ..., $m+k);
return 1;
END$BODY$
LANGUAGE 'plpgsql' VOLATILE;