代码之家  ›  专栏  ›  技术社区  ›  mic_e

PostgreSQL:参数替换为listen?

  •  1
  • mic_e  · 技术社区  · 6 年前

    常识规定SQL查询字符串应该 从未 手工组装。因此,所有数据库接口都提供参数替换,所有用户都使用它,没有例外。*

    我使用的是PostgreSQL v10.5、Nodejs v8.12.0、NodePostgres7.6.1。

    参数替换按预期工作 SELECT 声明:

    > await db.query("select from users where id = 'mic'");
    (success, 1 row returned)
    > await db.query("select from users where id = $1", ["mic"]);
    (success, 1 row returned)
    

    但它不适用于 LISTEN 声明:

    > await db.query("listen topicname");
    (success)
    > await db.query("listen $1", ["topicname"]);
    (error: syntax error at or near "$1")
    

    我要听的主题名称是动态的。它来自半可靠的来源,不应该由用户控制。但是,为什么要违背所有既定的最佳实践并冒险呢?

    不幸的是,从我的测试中,我担心PostgreSQL无法对 低收入学校的教师培养 查询。

    是否有解决方案或解决方法?

    *)这种说法可能只在某些乌托邦的未来社会才是正确的。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Laurenz Albe    6 年前

    在PostgreSQL中不能这样做,这是对的。

    作为解决方法,编写一个使用 dynamic SQL 这样地:

    EXECUTE format('LISTEN %L', topicname);
    

    这个 format 函数正确地转义字符串;在这种情况下, %L 产生正确引用字符串的格式 L iTeral是合适的。