Dee*_*pan 8 mysql node.js mysql-5.7
我在 MySQL 5.7 中有表说 TEST(id INT, attribute JSON)
当我尝试使用 mysql 包在 Nodejs 中查询表时,如下所示
con.query("select * from TEST where id=?", [req.params.id], function (err, results) {
if (err) throw err;
console.log(results);
});
Run Code Online (Sandbox Code Playgroud)
我得到以下输出
[
{
"id": 2,
"package": "{\"tag\": \"tag1\", \"item\": \"item1\"}"
}
]
Run Code Online (Sandbox Code Playgroud)
有没有办法在不迭代数组的情况下将上述结果中的包项作为 JSON 对象而不是字符串获取并执行 JSON.parse 将字符串转换为 JSON?
预期产出
[
{
"id": 2,
"package": {"tag": "tag1",
"item": "item1"}
}
]
Run Code Online (Sandbox Code Playgroud)
有没有办法在不迭代数组的情况下将上述结果中的包项作为 JSON 对象而不是字符串获取并执行 JSON.parse 将字符串转换为 JSON?
MySQL 5.7 支持JSON 数据类型,因此您可以将包类型更改为JSON并且您不必JSON.parse在每一行上迭代和执行,如果您的客户端支持此数据类型。
CREATE TABLE `your-table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`package` json DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)
现在包将是一个数组/对象:
con.query("select * from TEST where id=?", [req.params.id], function (err, results) {
if (err) throw err;
console.log(results[0].package.tag); // tag1 using mysql2
console.log(results[0].package.item); // item1 using mysql2
});
Run Code Online (Sandbox Code Playgroud)
如果您运行的 MySQL 版本低于 5.7 或者您不想使用该JSON类型,则需要自己迭代和解析它。
您可以使用这种衬垫:
results = results.map(row => (row.package = JSON.parse(row.package), row));
Run Code Online (Sandbox Code Playgroud)
如果您想知道是否应该或不应该将 JSON 存储在关系数据库中,那么这个问题中有一个很好的讨论:
小智 5
这与 Tanner 的答案略有不同,但是,如果您使用节点mysql库并且已使用 MySQL 的 JSON 数据类型在数据库中定义了字段,则可以在最初设置连接以转换任何 JSON 时使用“类型转换” - 任何对 JSON 对象的查询返回的类型化值:
let connection = mysql.createConnection(
{typeCast: function (field, next) {
if (field.type === "JSON") {
return JSON.parse(field.string());
} else {
return next();
}
}}
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9832 次 |
| 最近记录: |