PG不会连接大型SQL字符串

时间:2018-09-24 23:50:20

标签: node.js postgresql node-postgres

我正在使用Node-Postgres构建在线登录应用程序。我可以使用PSQL运行以下Postgres代码,没问题:

DO $$ 
BEGIN 
  IF (SELECT child.child_signedin FROM child WHERE child.child_name = 'mell') IS TRUE THEN 
    INSERT INTO signin (signin_child_id,signin_child_name,signin_intime)
    VALUES (12,mell,'2018-09-24 21:46:06.249+00'); 
  END IF; 
END $$

不幸的是,当我尝试使用Node_Postgres使其动态化时,出现以下错误:

  

“错误:绑定消息提供3个参数,但准备好的语句“”需要0”

这是我的nodejs代码:

signinTime = new Date();

let text = "DO $$ BEGIN IF (SELECT child.child_signedin FROM child WHERE child.child_name =  $1) IS TRUE THEN INSERT INTO signin (signin_child_id,signin_child_name,signin_intime)\
VALUES ($1,$2,$3); END IF; END $$"

let values = [req.body.childName, req.body.childId, signinTime];
pool.query(text, values, (err, response) => {
        if (err) {
            // console.log(JSON.stringify(err.stack));
            console.log(err.stack.split('\n', 1)[0])
        }
        else {
            res.send('complete')

        };//end else

    })

任何线索将不胜感激。

1 个答案:

答案 0 :(得分:0)

DO用于可以以多种语言执行的过程语句,并且node-postgres不会将其视为有效的SQL。您可以使用一些异步流控制来拆分语句以获得相同的结果。

示例:

const selectRes = await pool.query('SELECT child.child_signedin FROM child WHERE child.child_name =  $1', [req.body.childName]);

if (selectRes.rows.length && selectRes.rows[0].child_signedin === true) {
  await pool.query(`INSERT INTO signin
    (signin_child_id,signin_child_name,signin_intime)
      VALUES ($1,$2,$3);`, values);
}

或者创建一个Postgres函数并在查询中执行它。