【问题标题】:Prepared statements: Using unnamed and unnumbered question mark style positional placeholders准备好的语句:使用未命名和未编号的问号样式位置占位符
【发布时间】:2015-06-23 08:28:16
【问题描述】:

在除 Postgres 之外的 SQL 系统中,例如 MySQL,预准备语句可以使用问号 ? 作为预准备语句中数据的占位符。

INSERT INTO foo (id, name) VALUES (?, ?), (?, ?);

但是,在 Postgres 中,唯一可用的占位符似乎是编号占位符,所以上面的 INSERT Postgres 语句看起来像:

INSERT INTO foo (id, name) VALUES ($1, $2), ($3, $4);

当我尝试在一个语句中插入大量行时,就会出现这种语法的问题,对于 10,000 行和 10 列,我必须有范围为 $1 to $100,000 的占位符,这会导致 3-4 折查询大小增加。

Postgres 是否支持任何类型的未编号和未命名占位符用于准备好的语句?

编辑:

我正在使用准备好的语句,因为它们可以防御 SQL 注入。所以我的目标是在保持插入过程安全的同时尽可能快地保持批量插入。

【问题讨论】:

  • 只创建一次准备好的语句,使用 $1 和 $2,并执行多次。
  • 为什么查询语句大小有问题?
  • @FrankHeikens 多次执行准备好的语句似乎没有多行 INSERT 语句提供的更快批量插入的优势。
  • 准备好的语句是为了获得更好的性能,除非您在每个语句之后都提交。启动事务,创建准备好的语句,执行多次,提交。而已。安全快捷。
  • @FrankHeikens 交易确实使多次执行非常快

标签: postgresql


【解决方案1】:

Prepared statements 用于加速使用不同参数的同一查询的重复执行。 如果您的目标是一次插入多行,最好执行常规插入查询,这将比准备好的插入更快。但是,如果您坚持使用此解决方案,则可以使用数组作为准备好的语句的参数。示例:

create table foo(id int, val text);

prepare insert_into_foo (int[], text[]) as 
    insert into foo 
    select unnest(a), unnest(b)
    from (values ($1, $2)) v(a, b);

execute insert_into_foo (array[1,2,3], array['a','b','c']);
execute insert_into_foo (array[4,5,6,7], array['d','e','f','g']);

deallocate insert_into_foo; 

这个技巧的主要缺点是您需要非常小心地将相同数量的参数放入数组中。任何错误都可能是痛苦的。因此,我建议将其与保险丝一起使用:

prepare insert_into_foo (int[], text[]) as 
    insert into foo 
    select unnest(a), unnest(b)
    from (values ($1, $2)) v(a, b)
    where array_length(a, 1) = array_length(b, 1); -- fuse

execute insert_into_foo (array[1,2], array['a','b','c']); -- does nothing

【讨论】:

  • 准备好的语句不是对 SQL 注入也有用吗?这就是为什么我将它们用于插入。编辑:stackoverflow.com/questions/8263371/…
  • 是的,他们是。防御 SQL 注入的有效方法有很多,不一定以牺牲性能为代价。我已将答案编辑为不那么自信;)
  • 这个解决方案非常高效。比我测试过的许多其他解决方案更有效。这可能是因为它只有一个查询,查询的大小很小,而应用程序发送到 Postgres 服务器的其余部分只是行数据。我与之比较的其他解决方案涉及多个大量查询(批量多次插入)或大型查询(大型和少量多次插入),但这个解决方案只是简单地大放异彩。
猜你喜欢
  • 1970-01-01
  • 2011-12-29
  • 2018-06-04
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 2012-12-14
  • 2015-03-14
  • 1970-01-01
相关资源
最近更新 更多