SQLite3 Node.js JSON

Hys*_*sii 6 json node.js node-sqlite3

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

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

mki*_*ton 9

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);
    });
});
Run Code Online (Sandbox Code Playgroud)

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

  • 这对于大多数平台通过 node-pre-gyp 预构建和分发的二进制文件来说是正确的,但当您最终从源代码编译 sqlite3 模块时,这又不正确。根据我的经验,当您在 Linux 上从源代码进行编译时,您需要在执行“npm install sqlite3 --build-from-source=sqlite3”之前“导出 NODE_SQLITE3_JSON1=yes” - 来源:https://github.com/mapbox/node -sqlite3/blob/master/scripts/build_against_node.sh#L35 (3认同)
  • 我认为关键是 - 如果 node-pre-gyp 有一个为您预先构建的二进制文件,则 json1 扩展将在其中,但是如果您在“npm install sqlite3”时进行了源回退或强制它从源构建,您必须导出 NODE_SQLITE3_JSON1=yes 才能按照预构建二进制文件的方式进行构建 - 包含 json1。失败模式是,如果您尝试使用 json 函数,您将在“(”处收到“语法错误”(因为没有扩展名的 sqlite3 不知道它们)。希望这对人们有帮助:-) (3认同)