如何在Node.js中使用mysql sqlstring进行批量INSERT转义?

我正在使用这些node模块。

const mysql = require('mysql');
const SqlString = require('sqlstring');

我从文件中读取JSON并将JSON解析成一个嵌套数组。 然后我将嵌套数组传递到MySQL的批量INSERT中。

这在26个文件中的25个文件中工作得很好,加载了500多条记录。 有一个文件有21条JSON记录,只在下面的记录中失败。

[
    {
        "abstract": "... AWS Shared responsibility model:​ https://aws.amazon.com/compliance/shared-responsibility-model/; Enabling object-level logs in S3:​ ...",
        "title": "Defeating a Cloud Breach Part 1"
    }
]

我已经把问题隔离在 “抽象 “字段上。

我试过在将 “abstract “的值放入数组之前,分别使用 “mysql “和 “sqlString “模块中的connection.escape()和SqlString.escape()进行转义。 这两种情况都不能纠正任何导致INSERT失败的原因。

INSERT失败的原因是返回 “undefined”,不管是什么方法。 一个成功的INSERT会返回类似这样的结果。

OkPacket {
  fieldCount: 0,
  affectedRows: 4,
  insertId: 142,
  serverStatus: 2,
  warningCount: 0,
  message: '&Records: 4  Duplicates: 0  Warnings: 0',
  protocol41: true,
  changedRows: 0
}

MySQL表中的 “abstract “列的类型是 “text”,还有许多其他记录的长度超过了上面的问题记录。

SqlString — 当我迭代JSON键值时,我尝试在将字符串放入嵌套数组之前进行转义。

例如:abstract = SqlString.escape(value))

我也试过在整个INSERT语句上,这样。

var sql = "INSERT INTO tbl (abstract,title,url,key_word) VALUES ?";

sql = SqlString.format(sql, [dbVals]);

var query = client.query(sql, function(err, result) {
console.log(result);
});

很明显,在上面的代码中,”client “是 “mysql “CONNECTIONS的一个实例(这就是为什么我还尝试用mysql.escape()和client.escape()来代替SqlString.escape()的原因)。

但我得到的结果完全一样,而且 仅此一次.

我已经确认这个内容是问题所在,因为我既删除了上面的记录,又将abstract的值设置为空字符串,而且在这两种情况下,批量INSERT都成功了。

我希望能得到第二双眼睛的帮助。 更好的是,我希望得到指导,我做错了什么,以适当地逃避内容,使这将不会是一个未来的问题。

谢谢你。

EDIT:对问题进行了额外的细节补充。

解决方案:

我怀疑你的问题可能是你的模式。同样让人困惑的是:你的例子中有一部分表明你试图插入4个值。(abstract,title,url,key_word)但你的payload只包含2个字段–不清楚这种差异,也不清楚defaultsnulls在DB端是如何处理的。

使用你提供的示例有效载荷,使用最佳猜测模式进行测试,我没有遇到任何问题。由于你的payload只包括2个字段,我的测试只包括这些字段。下面是每个组件的示例,以便与你自己的组件进行比较。

如果你仍然遇到问题,请随时分享你的DB、表模式和字段的其他细节。该 charset 您的DB、表和字段的细节可能也是一个很好的调查对象。

数据库细节 MySQL v5.7.12

CREATE TABLE `tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `abstract` text,
  `title` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

结点

// 
// other require items here as well depending on file location in project
// 
const mysql = require('mysql');

const db = mysql.createPool({
  connectionLimit: 10,
  host: process.env.DB_HOST || '127.0.0.1',
  user: process.env.DB_USER || 'local_user',
  password: process.env.DB_PASSWORD || 'local_password',
  database: process.env.DB_NAME || 'local_database',
  multipleStatements: true, 
  charset: 'utf8mb4' // necessary if you might need support for emoji characters
});

let entries = [
  {
    "abstract": "An easy one",
    "title": "Defeating a Cloud Breach Part 0"
  },
  {
    "abstract": "... AWS Shared responsibility model:​ https://aws.amazon.com/compliance/shared-responsibility-model/; Enabling object-level logs in S3:​ ...",
    "title": "Defeating a Cloud Breach Part 1"
  },
  {
    "abstract": "Another easy one",
    "title": "Defeating a Cloud Breach Part 2"
  }
]
let keys = Object.keys(entries[0]);
let values = entries.map( obj => keys.map( key => obj[key]));
let sql = 'INSERT INTO tbl (' + keys.join(',') + ') VALUES ?;';
db.query(sql, [values], function (error, results) {
  if (error) console.log(error.code);
  console.log(results);
});

结果

OkPacket {
  fieldCount: 0,
  affectedRows: 3,
  insertId: 1,
  serverStatus: 2,
  warningCount: 0,
  message: '&Records: 3  Duplicates: 0  Warnings: 0',
  protocol41: true,
  changedRows: 0
}

db screenshot

给TA打赏
共{{data.count}}人
人已打赏
未分类

在`.node_modulesReact`中没有找到`React-Core`的podspec。

2022-9-8 2:01:43

未分类

分析服务查询副本。在主副本上只加载和处理单个数据模型而不从副本中删除?

2022-9-8 2:12:36

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索