使用express和postman尝试POST数据时出现MySQL语法错误

MySQL syntax error when attempting to POST data using express and postman


问题

我试图通过以下查询将一些测试数据发布到MYsql数据库中。

Asset.create = (newAsset, result) => {
    sql.query("INSERT INTO `assets` VALUES (?, ?, ?, ?, ?)", newAsset, (err, res) => {
        if (err) {
            console.log("error", err);
            result(err, null);
            return;
        }

        console.log("Created new asset : ", { id: res.insertId, ...newAsset});
        result(null, {id: res.insertId, ...newAsset});
    }); 

使用postman中的以下Json输入:

{
    "Id" : 6,
    "AccountID" : "6",
    "AssetID" : "6",
    "AssetSymbol" : "6",
    "Amount" : "60"

}

但是我得到了以下错误:

 sqlMessage: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?, ?, ?, ?)' at line 1",
  sql: "INSERT INTO `assets` VALUES (`id` = 6, `accountid` = '6', `assetid` = '6', `assetsymbol` = '6', `amount` = '60', ?, ?, ?, ?)" 

我的资产表的MySQL模型如下。

Id: INT (Not autoincrementing)
AccountID: VARCHAR(45)
AssetID: VARCHAR(45)
AssetSymbol: VARCHAR(45)
Amount: VARCHAR(45)

我知道这对MySQL数据库来说是个糟糕的设计。它现在只是一个测试数据库,直到我掌握了使用MySql和Express的窍门,以后会做一个新的合适的数据库。 如果有任何关于我做错了什么的建议,将非常感谢。

似乎你混淆了/混合了至少3种不同的编写INSERT的方法。有 关于MySQL和INSERT的具体文档 也许你应该快速回顾一下
我认为你可能可以这样做,从它被扩展为 sql.query("INSERT INTO `assets` SET ?, ?, ?, ?, ?", newAsset ..... 的内容来看
或者用你的方法,只传递参数中的值 [6,6,6,60]
我确实怀疑我把不同的方法搞混了。我有一个方法不工作,所以我跳到Stack上寻找插入到mysql的其他方法。它并不完全适合我的其他工作,所以我尽可能地使它适合我的工作
尽管如此,下面的人还是找到了一个方法来使它工作。谢谢所有的建议,朋友们。它的赞赏
答案1

普通的 node-mysql 库不支持使用这样的对象。你应该把对象转换成一个数组:

Asset.create = (newAsset, result) => {
  sql.query("INSERT INTO `assets` VALUES (?, ?, ?, ?, ?)", Object.values(newAsset), (err, res) => {
    if (err) {
      console.log("error", err);
      result(err, null);
      return;
    }

    console.log("Created new asset : ", {
      id: res.insertId,
      ...newAsset
    });
    result(null, {
      id: res.insertId,
      ...newAsset
    });
  });
}

有一些包可以添加命名的占位符,你可以用谷歌找到它们。然后你就可以写:

Asset.create = (newAsset, result) => {
  sql.query("INSERT INTO `assets` VALUES (:Id, :AccountID, :AssetID, :AssetSymbol, :Amount)", newAsset, (err, res) => {
    if (err) {
      console.log("error", err);
      result(err, null);
      return;
    }

    console.log("Created new asset : ", {
      id: res.insertId,
      ...newAsset
    });
    result(null, {
      id: res.insertId,
      ...newAsset
    });
  });
}