具有CTE的pg-promise动态列

时间:2017-10-06 22:55:41

标签: javascript pg-promise

我正在尝试使用快速服务器上的pg-promise使用AJAX请求更新我的数据库。

到目前为止一切正常,但现在我想使用CTE(WITH)更新两个表,这也是有效的。我现在要做的是能够拥有动态列,具体取决于PUT请求。

澄清:

  1. 请求

    {
        "dob": "01.01.1970",
        "email": "example@example.com",
        "street": "street 1",
    }
    
  2. 请求

    { 
        "dob": "01.01.1970",
        "email": "example@example.com",
        "phone": "0000",
        "tag": "blue",
    }
    
  3. 我尝试了以下内容并且它正在运行,但我的问题是:

    1. 我正确使用pg-promise吗?
    2. 这种方法是否仍然是SQL注入安全的(:raw )?
    3. 有更好的方法可以达到相同的效果吗?
    4. QueryFile.sql

      WITH update_table_one AS (
          UPDATE table_one SET username=${username} 
          WHERE identification_number=${identification_number}
          RETURNING identification_number
      )       
      UPDATE table_two SET ${fromSet:raw}
      WHERE identification_number=(SELECT identification_number FROM update_table_one);
      

      Server.js

      let qf = // ...QueryFile
      let helpers = pgp.helpers;
      let user = req.params.user;
      let body = req.body;
      
      let dbBody = {
          username: user,
          identification_number: 'ABC123',
          fromSet: helpers.sets(body)
      };
      
      db.oneOrNone(qf, dbBody)
          .then(data => {
              res.json({ success: true, message: 'Yes!' });
          })
          .catch(error => {
              res.json({ success: false, message: 'No!' });
          });
      

      除了最初的问题(与评论中的问题有关):

          { 
              "dob": "01.01.1970",
              "email": "example@example.com",
              "street": "street 1",
              "phone": "0000",
              "tag": "blue",
              "group": "students",
              "password": "hash",
              "track": "one",
          }
      

1 个答案:

答案 0 :(得分:0)

  

我正确使用pg-promise吗?

几乎。您的查询没有返回任何内容,因此使用方法oneOrNone在逻辑上是不正确的,而应该是none

  

这种方法仍然是SQL注入安全(:raw)吗?

是的,因为即使您正在注入原始设置,这些列也会根据其JavaScript类型自动在helpers内进行预转义,因此任何注入尝试都会在那里被挫败。

  

有没有更好的方法来获得相同的结果?

只有事先了解了所有列,才能将它们预先声明为ColumnSet,以获得更好的性能和/或类型转换。但除此之外,没有。

另请注意,如果您呼叫UPDATE没有列传入,则会返回一个空字符串per the API,这将导致无效的[