PG не будет объединять большие строки SQL - PullRequest
0 голосов
/ 25 сентября 2018

Я использую Node-Postgres для создания онлайн-приложения для входа.Я могу запустить следующий код Postgres без проблем с помощью PSQL:

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, я получаю следующую ошибку:

"ошибкаСообщение bind содержит 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 голосов
/ 25 сентября 2018

DO для процедурных операторов, которые могут быть выполнены на разных языках, и не обрабатывается в post-gres узла как допустимый 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 и выполнить ее в запросе.

...