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.js中SQLite3
最快,最
简单的
库”)。 它旨在用于
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函数的返回结果,从而将异步操作变为同步操作。