如何在sqlite3 db.get和db.all中使用async/await



这是我的服务器mcve:

const express = require("express");
const app = express();
const fs = require("fs");
const dbFile = "./sqlite.db";
const exists = fs.existsSync(dbFile);
const sqlite3 = require("sqlite3").verbose();
const db = new sqlite3.Database(dbFile);
app.get("/", async (req, resp) => {
await db.run(`INSERT INTO Times VALUES (${ Date.now() })`);
let rows = await db.all("SELECT time FROM Times");
console.log(rows); // The line where I console log rows
resp.send(rows);
});
app.listen(process.env.PORT || 8080);
process.on("uncaughtException", console.log);

上面的服务器正在记录这样的数据库对象,

Database {}

每次刷新网站时都会在控制台中显示,但我希望它记录我插入数据库的行。

我在这里做错了什么?

NPM上有几个SQLite包。

sqlite3

这是您正在使用的程序包。它是基于回调的,应该这样使用:

db.all("SELECT time FROM Times", function(err, rows) { });

注意:.all()函数返回数据库实例,而不是结果,因此可以执行以下操作:db.all(query1, (err, rows) => {}).all(query2, (err, rows) => {});。查询2不会等待查询1完成。

硅铝石

这是sqlite3包的包装器,事实上,需要安装它才能正常工作。基于承诺:

const rows = await db.all("SELECT time FROM Times");

更好的sqlite

这是一个完全不同的包裹。它不像上面两个例子那样异步运行查询,而是在主线程中运行每个查询。它的作者认为这是更好的(对于典型的SQLite工作负载(。

const rows = db.prepare("SELECT time FROM Times").all();

如果sqlite3不支持async/await,那么您需要创建一个具有如下承诺的异步函数e.x.

async function db_all(query){
return new Promise(function(resolve,reject){
db.all(query, function(err,rows){
if(err){return reject(err);}
resolve(rows);
});
});
}

然后像这个一样使用

await db_all("SELECT time FROM Times");

对sqlite3中需要使用的每个函数使用相同的方法。

最好的方法是创建一个模块并覆盖所有这些需要的方法

以上都不是我的选择:(

"better sqlite"是一个python压载包,它只是增加容器"sqlite"看起来像M$typescript掌握培训

我用这个漂亮的&简单解决方案https://www.scriptol.com/sql/sqlite-async-await.php

或者当需要交易支持并且额外的小程序包没有问题时https://www.npmjs.com/package/sqlite-async

最新更新