【问题标题】:how to fix Postgres error: bind message supplies 8 parameters, but prepared statement "" requires 6如何修复 Postgres 错误:绑定消息提供 8 个参数,但准备好的语句“”需要 6 个
【发布时间】:2021-08-01 07:12:38
【问题描述】:

我正在后端准备我的模型 我有 tab1 包含 id 和 col:t1 我想先插入该表,然后获取它的 id 并将其与其他 col 一起插入到我的 tab2 中。所以 id_tab2 是我来自 tab1 的外键(tab 2 有自己的 id ofc 而不是 id_tab2) 这是我声明查询的文件:

const createUser=(req, res, next) => {
  let con=req.con
let { t1,x1,x2,x3,x4,x5,x6,id_tab2 } = req.body;
  con.query(
`SELECT * FROM users
  WHERE x3 = $1`,
[x3],
(err, results) => {
  if (err) {
    console.log(err);
    res.status(404).json({message: err});
  }

  if (results.rows.length > 0) {
     res.status(404).json({message: "user exists"});
  } else {

  const hashedPassword = bcrypt.hashSync(x4, parseInt(process.env.BCRYPT_ROUNDS));
  con.query('WITH ins1 AS ( INSERT INTO tab1(t1)  VALUES ($1) RETURNING id AS id_tab2), ins2 AS ( INSERT INTO tab2 (x1,x2,x3,x4,x5,x6,id_tab2)  SELECT $1,$2,$3,$4,$5,$6,id_tab2 FROM ins1  RETURNING id,x1, x2,x3, x4, x5,x6,id_tab2)  SELECT x1, x2,x3, x4, x5,x6,id_tab2 from ins2',
  [t1,x1, x2,x3, x4,hashedPassword,x6,id_tab2 ],
      (err, results) => {
        if (err) {
          console.log(err);
          res.status(404).json( {message: err});
        }
        else
        {res.status(200).send(results.rows[0])}
      }
    );
  }
}
 );
}

当我从 Vue 前端调用 api 时: 这是文件:

axios.post("/accnt/register",data)
  .then((res)=>{
   this.$emit("addedUser",res.data)
    message.success(`user added`)
  })
.catch((e)=>{
    message.warning(e.response.data.message)
  }) 
    })
    .catch(error => {
      console.log('error', error);
    });

我在服务器端得到这个错误:

error: bind message supplies 8 parameters, but prepared statement "" requires 6
.
.
.
.
.
routine: 'exec_bind_message'

我不知道我在这个查询中做错了什么知道如何解决这个问题吗?

【问题讨论】:

    标签: node.js postgresql vue.js axios


    【解决方案1】:

    您的语句只有 6 个占位符,但您的调用有 8 个参数。错误消息似乎不言自明。

    你没有把你想要在这里发生的事情说得很清楚,看到我们不得不猜测你的意图。您使用了两次$1,但是根据您使用它的列的名称,您可能应该重新编号为从 $1 到 $7,并且每个只使用一次,而不是从 $1 到 $6,其中一个使用两次。此外,看起来 id_tab2 应该是由数据库从一个序列生成的,但是你为什么要为它传递一个值呢?如果重新编号参数,并从传入参数列表中删除 id_tab2,那么两者都是 7。

    【讨论】:

    • 实际上我拥有的是我应该填写输入的表单:第一个输入属于 tab1(col 不在 tab2 中),然后其他输入属于 tab2,我试图做的是当我提交表单时,我想从 tab2 获取字段,其中 tab1 的字段具有相同的 id ,所以像 tab1 的这个 id 是填写表单其余部分的人
    • 我在 pgadmin4 中尝试了这个查询,它工作正常,我正确地将数据插入到两个表中
    • 你是如何在 pgadmin4 中做到的?我不相信它提供了准备好的陈述。
    • 我没有明显地使用 $,我输入了真实数据,现在我做了你告诉我的将 $2 更改为 $8(第一个值为 $1)的事情现在是表格已提交并且我的 tab1 沿 tab2 侧填充,但在我的 id_tab2 列中,我得到 null 而不是 tab1 的 id
    【解决方案2】:

    我实际上将代码更改为此代码,并且由于@jjanes 的回答,我对参数有了更多的了解并专注于它们:

    const createUser=(req, res, next) => {
    let con=req.con
    let { t1,x1,x2,x3,x4,x5,x6 } = req.body; <---deleted id_tab2
      con.query(
    `SELECT * FROM users
      WHERE x3 = $1`,
     [x3],
    (err, results) => {
    if (err) {
    console.log(err);
    res.status(404).json({message: err});
     }
    
      if (results.rows.length > 0) {
     res.status(404).json({message: "user exists"});
      } else {
    
     const hashedPassword = bcrypt.hashSync(x4, 
      parseInt(process.env.BCRYPT_ROUNDS));
    con.query('WITH ins1 AS ( INSERT INTO tab1(t1)  VALUES ($1) RETURNING id AS 
     id_tab2), ins2 AS ( INSERT INTO tab2 (x1,x2,x3,x4,x5,x6,id_tab2)  SELECT 
     $2,$3,$4,$5,$6,$7,id_tab2 FROM ins1  RETURNING id,x1, x2,x3, x4, 
     x5,x6,id_tab2)  
     SELECT x1, x2,x3, x4, x5,x6,id_tab2 from ins2',
     [t1,x1, x2,x3, x4,hashedPassword,x6], <---deleted id_tab2
      (err, results) => {
        if (err) {
          console.log(err);
          res.status(404).json( {message: err});
        }
        else
        {res.status(200).send(results.rows[0])}
         }
       );
      }
     }
    );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 2014-11-30
      • 2021-12-21
      • 1970-01-01
      • 2017-05-14
      • 2013-08-09
      • 1970-01-01
      相关资源
      最近更新 更多