【问题标题】:INSERT JSON array into MYSQL Database with NodeJS使用 NodeJS 将 JSON 数组插入 MYSQL 数据库
【发布时间】:2022-08-14 06:25:06
【问题描述】:

我正在尝试将 JSON 数组泵入 MYSQL 数据库,我已经找到了类似的东西,但该解决方案对我不起作用。 Similiar issue i found

这是我首先尝试从请求中对正文进行字符串化,然后通过

INSERT INTO table SET ?

表创建如下:

CREATE TABLE IF NOT EXISTS db.AStockHistory 
( Symbol text NOT NULL, 
Date timestamp NOT NULL, 
Open double, 
High double, 
Low double, 
Close double, 
Volume double, 
Dividends double, 
Stock_Splits double );

我的 NodeJS 代码:

async function create(stockHistory){

  var data = JSON.stringify(stockHistory);
  const result = await db.query(
    `INSERT INTO db.AStockHistory SET ?`, data); 
  return {message};
}

这是我尝试通过邮递员推送的完整 JSON 数组。 JSON 的生成结构由 pandas 数据框构成。

 [
  {
    Symbol: \'msft\',
    Date: \'2022-07-20 00:00:00\',
    Open: 259.8999938965,
    High: 264.8699951172,
    Low: 258.9100036621,
    Close: 262.2699890137,
    Volume: 22788300,
    Dividends: 0,
    Stock_Splits: 0
  },
  {
    Symbol: \'msft\',
    Date: \'2022-07-21 00:00:00\',
    Open: 259.7900085449,
    High: 264.8900146484,
    Low: 257.0299987793,
    Close: 264.8399963379,
    Volume: 22404700,
    Dividends: 0,
    Stock_Splits: 0
  },
  {
    Symbol: \'msft\',
    Date: \'2022-07-22 00:00:00\',
    Open: 265.2399902344,
    High: 265.3299865723,
    Low: 259.0700073242,
    Close: 260.3599853516,
    Volume: 21871000,
    Dividends: 0,
    Stock_Splits: 0
  },
  {
    Symbol: \'msft\',
    Date: \'2022-07-25 00:00:00\',
    Open: 261,
    High: 261.5,
    Low: 256.8099975586,
    Close: 258.8299865723,
    Volume: 21056000,
    Dividends: 0,
    Stock_Splits: 0
  },
  {
    Symbol: \'msft\',
    Date: \'2022-07-26 00:00:00\',
    Open: 259.8599853516,
    High: 259.8800048828,
    Low: 249.5700073242,
    Close: 251.8999938965,
    Volume: 38096200,
    Dividends: 0,
    Stock_Splits: 0
  }
]

我得到以下输出:

您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 靠近 \'\'[{\"符号\":\"msft\",\"日期\":\"2022-07-20 00:00:00\",\"Open\":259.8999938965,\' 在第 1 行你有一个错误 你的 SQL 语法;检查与您的 MySQL 对应的手册 服务器版本,以便在附近使用正确的语法 \'\'[{\"符号\":\"msft\",\"日期\":\"2022-07-20 00:00:00\",\"Open\":259.8999938965,\' 在第 1 行错误:您有一个 SQL 语法错误;检查与您对应的手册 MySQL 服务器版本,以便在附近使用正确的语法 \'\'[{\"符号\":\"msft\",\"日期\":\"2022-07-20 00:00:00\",\"Open\":259.8999938965,\' 在第 1 行 在 PromiseConnection.query

  • 你试过db.query(`INSERT INTO db.AStockHistory VALUES (?)`, data);吗?
  • 使用插入..选择。在 SELECT 部分使用 JSON_TABLE() 解析您的数组以分隔行和列值。 PS。不要将 DOUBLE 用于整数属性,不要将 TEXT 用于短字符串。并且,如果日期值不是本地的,则使用 DATETIME(如果时间部分始终为零 - 使用 DATE)。
  • @GrafiCode 我试过但同样的错误。
  • @Akina 感谢您的想法,我也会尝试。我刚刚看到这种方式应该可行,就像我在另一个 stackoverflow 问题中提到的那样。为此,我只想保持简单。并将其推入数据库而不进行任何进一步的操作。但是,好的,现在我尝试通过分开来完成它。表调整,好点。会检查的。
  • 注意!显示的参数值(对象数组)不是来自 MySQL 的有效 JSON 值。

标签: mysql node.js json


【解决方案1】:

对我来说,我找到了解决我的问题的方法,现在它可以工作了,谢谢@Akina

async function create(stockHistory){
    var response = [];
    for (let i = 0; i < stockHistory.length; i++) {
      var data = stockHistory[i]
      try {
        const result = await db.execute(
          `INSERT INTO db.AStockHistory (Symbol, Date, Open, High, Low, Close, Volume, Dividends, Stock_Splits) VALUES ('${data.Symbol}', '${data.Date}', ${data.Open}, ${data.High}, ${data.Low}, ${data.Close}, ${data.Volume}, ${data.Dividends}, ${data.Stock_Splits});`); 
      
        if (result.affectedRows) {
          response [i] = 'Stock History Symbol: '+ data.Symbol + ', Date: ' + data.Date +' created successfully';
        }
      } catch {
      response [i] = 'Error in creating Stock History for Symbol: '+ data.Symbol + ', Date: ' + data.Date;
      }
  }
  return {response};

【讨论】:

    猜你喜欢
    • 2014-04-26
    • 1970-01-01
    • 2012-07-21
    • 2014-04-26
    • 2013-03-25
    • 1970-01-01
    • 2018-10-31
    • 2012-04-20
    相关资源
    最近更新 更多