【问题标题】:SQLite3 Node.js JSONSQLite3 Node.js JSON
【发布时间】:2019-04-06 05:32:54
【问题描述】:

我正在使用sqlite3 NPM 包。我想将 JSON 存储在我的数据库列之一中。我知道 SQLite 本身能够存储 JSON https://www.sqlite.org/json1.html,但我不一定确定如何通过 Node.js 来做到这一点。

之前有没有人遇到过这种情况,使用sqlite3 NPM 包来存储 JSON?使用轻量级 NoSQL 数据库会更好吗?

【问题讨论】:

  • 除了存储和检索之外,您是否真的想对数据库中的 JSON 进行 任何操作?如果没有,您可以将其视为文本或 blob。
  • @jonrsharpe 不,这将用作 express api。但最终,格式需要是纯 JSON,而不是文本,只是想知道是否有办法在 nodejs 中做到这一点。
  • 也许您可以提供更多上下文。您可能应该解析 JSON 并将结构化结果存储在您的数据库中。还要澄清您认为“纯 JSON”的含义。
  • 你试过字符串化你的 JSON 吗?
  • 每个人都想说“你不需要它”或“不要这样做”,假设提问者需要它,对吗?在我的例子中,一个软件包的演示有一个 JSON 列,他们在其中放置了您可能需要的任意键/值的东西,结果我需要选择一个。 '"SELECT *, json_extract(locations.extras, '$.device.uuid')" + " FROM locations, json_tree(locations.extras, '$.device') " + " WHERE json_tree.value='" + uniqueID + "'";' - 完毕。 SQL 数据库中的 JSON 可能会被滥用,但在您需要时它是一个方便的工具。

标签: node.js json node-sqlite3


【解决方案1】:

sqlite3 包默认支持 Sqlite JSON1 扩展。稍微修改一下 sqlite3 包提供的示例:

const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database(':memory:');

db.serialize(function() {
    db.run('CREATE TABLE lorem (info TEXT)');
    let stmt = db.prepare('INSERT INTO lorem VALUES(json(?))');
    for (let i=0; i<10; i++) {
        stmt.run(JSON.stringify({ a: i }));
    }
    stmt.finalize();

    db.each('SELECT rowid AS id, json_extract(info, \'$.a\') AS info FROM lorem', function(err, row) {
        console.log(row.id + ": " + row.info);
    });
});

请注意,对于某些包配置或安装,默认情况下可能不包含 JSON1 扩展。如果这对您不起作用,请参阅 Mike Hardy 对此答案的评论。

【讨论】:

  • 当您最终从源代码编译 sqlite3 模块时,对于大多数平台通过 node-pre-gyp 预构建和分发的二进制文件来说,这都是正确的。根据我的经验,当您在 linux 上从源代码编译时,您需要在执行 npm install sqlite3 --build-from-source=sqlite3 之前 export NODE_SQLITE3_JSON1=yes - 来源:github.com/mapbox/node-sqlite3/blob/master/scripts/…
  • 谢谢,这很有用,我会以某种方式将其纳入我的答案中。
  • 我认为关键是 - 如果 node-pre-gyp 有一个为您预构建的二进制文件,json1 扩展将在其中,但如果您做了源后备或强制它从当你'npm install sqlite3'时,你必须导出 NODE_SQLITE3_JSON1=yes 以按照他们对预构建二进制文件的方式进行构建 - 包括 json1。失败模式是,如果您尝试使用 json 函数(因为没有扩展名的 sqlite3 不知道它们),您将在 '('' 处收到“语法错误”。希望这对人们有所帮助:-)
猜你喜欢
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
  • 2016-03-24
  • 2019-05-16
  • 2020-05-23
  • 1970-01-01
  • 2015-12-08
  • 2021-05-11
相关资源
最近更新 更多