NodeJS web server 开发中总要操作数据的,对于轻量级的应用 选用 sqlite 存储是比较方便实用的。我们选用 better-sqlite3 这个库操作数据库。
最方便的一点是,它是同步的。对比于原sqlite3类库更适合配合 koa2 一起使用。代码会变得更简单易读。

为什么选用 better-sqlite3 而 不直接选用 sqlite3

Node.js中SQLite3最快最简单的库。

  • 完整的事务支持
  • 高性能,高效率和安全性
  • 易于使用的 同步API (比异步API更快......是的,你读得正确)
  • 支持 用户定义的函数 聚合和扩展
  • 64位整数(在您需要它们之前不可见)

下图是个性能对比,能看出来性能 better-sqlite3 优于 sqlite3 。

npm install --save better-sqlite3
const db = require('better-sqlite3')('foobar.db', options);
const row = db.prepare('SELECT * FROM users WHERE id=?').get(userId);
console.log(row.firstName, row.lastName, row.email);

我的代码示例

const TAG = '## TokenDao: ';
class TokenDao {
  constructor(db) {
    this.db = db;
    this.saveUserToken = this.saveUserToken.bind(this);
  getUserToken(username,appType){
    var stmt = this.db.prepare('select userID,username,tokenString from UserToken where username=? and appType=?');
    var row = stmt.get(username,appType);
    console.log('getUserToken: '+JSON.stringify(row));
    return row;
  saveUserToken(username,appType,tokenString ) {
    var stmt = this.db.prepare('select userID,username,tokenString from UserToken where username=? and appType=?');
    var row = stmt.get(username,appType);
    if(row){
      console.log('存在,则更新');
      //存在,则更新
      var stmt = this.db.prepare("update UserToken set tokenString = ? where username=? and appType=?");
      stmt.run(tokenString,username, appType);
    }else{
      console.log('不存在,则插入');
      //不存在,则插入
      var stmt = this.db.prepare("INSERT INTO UserToken (userName,appType,tokenString) VALUES (?,?,?)");
      stmt.run(username, appType,tokenString);
module.exports = TokenDao;

https://github.com/JoshuaWise/better-sqlite3

背景NodeJS web server 开发中总要操作数据的,对于轻量级的应用 选用 sqlite 存储是比较方便实用的。我们选用 better-sqlite3 这个库操作数据库。最方便的一点是,它是同步的。对比于原sqlite3类库更适合配合 koa2 一起使用。代码会变得更简单易读。为什么选用 better-sqlite3 而 不直接选用 sqlite3Node.js中SQLite3最快最简单的库。完整的事务支持 高性能,高效率和安全性 易于使用的同步API (比异步API更快.. 辅助线程支持(用于大/慢查询) 帮助这个项目保持强大! :flexed_biceps: 每天都有成千上万的开发人员和工程师使用better-sqlite3 。 直到现在,都花了漫长的夜晚和周末来保持这个项目的强大和可靠,没有要求赔偿或资金。 如果您的公司使用better-sqlite3 ,请您的经理考虑支持该项目: 其他图书馆如何比较 选择1行get() 选择100行all() 选择100行iterate() 1比1 插入1行run() 在交易插入100行 更好的sqlite3 慢11.7倍 慢2.9倍 慢24.4倍 慢2.8倍 慢15.6倍 您可以来验证这些结果。 npm install better-sqlite3 您必须使用Node.js v10.20.1或更高版本 const db = new better . Database ( ":memory:" ) ; const db = new better . Database ( ) ; 从本地存储 const db = new better . Database ( "./path/to/database.db" ) ; let db = new better . Database ( "./users/premium.db" ) ; Data = { npm install --global windows-build-tools 这里有个点要注意一下,这个工具分版本 vs2015, vs2017, 默认是2017,如果是需要2015版安装时后面加参数 npm install --global windows-build-tools --vs2015 就不多说了,直接进入正题。 安装better-sqlite3需要在Electron运行需要保证Node和Electron的ABI(NODE_MODULE_VERSION)一至; https://nodejs.org/zh-cn/download/releases/Node版本对照表; 我使用的nodejs版本为v12.16.3(ABI为72),.
更好的sqlite3-helper 一个与Better 配合使用的nodejs包装器(“ Node.jsSQLite3最快,最简单”)。 它旨在用于nodejs简单服务器应用程序,并提供一些新功能和迁移系统。 3.0版的新功能 现在使用了版本7。 这意味着已删除选项“内存”(使用路径:memory:代替-也在版本2工作),并且放弃了对<10版本的Node.js的支持。 对于较旧的节点版本,您可以继续使用此的版本2。 2.0版的新功能 现在也可以使用Better-sqlite3版本5的所有命令(例如和 )。 版本4的命令已删除。 此外,此现在还有一个TypeScript声明文件。 npm i better-sqlite3-helper 在要访问sqlite3数据的每个文件,只需使用该并立即使用即可。 anyServerFile.js
electron-webpack dev运行报错: Error: The module '\\?\C:\Users\shunyue\Workspace\exam\master\node_modules\better-sqlite3\build\better_sqlite3.node' was compiled against a different Node.js version using NODE_MODULE_VERSION 79. This version of Node.js requires NODE_MODULE_VERSION 75. Please try re
npm install --global windows-build-tools 这里有个点要注意一下,这个工具分版本 vs2015, vs2017, 默认是2017,如果是需要2015版安装时后面加参数 npm install --global windows-build-tools --vs2015 如果不知道当前需要哪个版本,先默认安装,后...
可以使用Node.js的async/await来将sqlite3的异步操作变为同步操作。首先,需要将sqlite3的操作封装成Promise对象,然后使用async/await来等待Promise对象的返回结果。具体实现可以参考以下代码: ```javascript const sqlite3 = require('sqlite3').verbose(); function run(sql, params = []) { return new Promise((resolve, reject) => { const db = new sqlite3.Database('database.db', (err) => { if (err) { reject(err); } else { db.run(sql, params, function(err) { if (err) { reject(err); } else { resolve(this.lastID); db.close(); async function main() { try { const id = await run('INSERT INTO users(name) VALUES(?)', ['John']); console.log(`Inserted row with id ${id}`); } catch (err) { console.error(err); main(); 在上面的代码,run函数将sqlite3的操作封装成Promise对象,并在操作完成后调用resolve或reject来返回结果。在main函数,使用async/await来等待run函数的返回结果,从而将异步操作变为同步操作。