postgresql 使动态内存函数更具可读性

p8ekf7hl  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(3)|浏览(112)

我有一个用户定义的Postgres函数,它可以动态执行INSERT。代码不可读,而且由于字符串转义,很难修改它。有没有办法让它看起来更好?
下面是我的代码,为了简洁起见省略了一些部分:

BEGIN
    -- some code

    -- escape nightmare for teammates goes here

EXECUTE 'INSERT INTO ' || _table || E'(col1, col2, col3)  VALUES (\'' || _col1 ||
                E'\', \'' || _col2 || E'\''||  E', \'' || _col3::text ||E'\') ON CONFLICT DO NOTHING RETURNING code' INTO _code;

    -- more code
END

字符串
有没有办法简化E'\', \''之类的东西?

lnxxn5zx

lnxxn5zx1#

使用**format()**,就像Richard已经指示的那样。这不仅更具可读性,而且还修复了原始版本中明显的SQL注入问题。
另外,根本不要连接 values。使用USING子句将它们作为值传递:

EXECUTE format(
   'INSERT INTO %I (col1,col2,col3) VALUES ($1,$2,$3)
    ON CONFLICT DO NOTHING
    RETURNING code', _table)
INTO  _code
USING _col1, _col2, _col3::text;  -- do you need to cast?

字符串
为了确保这一点,请使用模式限定的表名-不能像上面的代码那样作为单个标识符传递。模式和表名必须单独引用。请参阅:

  • 表名作为PostgreSQL函数参数
  • 触发器函数中具有动态表名的查询
  • 将动态查询的结果转换为JSON
  • 重构PL/pgSQL函数以返回各种SELECT查询的输出

请务必理解并使用美元报价

  • PL/pgSQL中的'$$'是什么
  • 在PostgreSQL中插入带单引号的文本
g2ieeal7

g2ieeal72#

利用格式

format('INSERT INTO %I (col1,col2,col3) VALUES (%L,%L,%L)', _table, _col1, _col2, _col3);

字符串

chhkpiq4

chhkpiq43#

我所做的是添加注解--特别是结果查询的样子。你不能改变代码的工作方式,也不应该经常这样做,当有人知道最终结果会让你更容易理解代码是如何构建它的。

相关问题