在javascript中异步等待sqlite

Mit*_*ops 4 javascript sqlite asynchronous node.js async-await

我正在查看本教程,其中有一个名为 aa-sqlite 的库,以便用 async-await 替换 Promises() 语法。

没有在 npm 上看到 aa-sqlite。async await sqlite 是否还有另一种更新的语法?

这是我正在尝试使用标准 sqlite 库:

const sqlite3 = require('sqlite3').verbose();
let db = new sqlite3.Database("tmp.db")

async function myfunc(db) {
  let sql = "SELECT id id FROM TABLE LIMIT 2"
  let res1 = await db.run(sql)
  console.log(res1)
  for (row of res1) {
    console.log(row);   
  }
Run Code Online (Sandbox Code Playgroud)

但这会产生

TypeError: res1 is not iterable
Run Code Online (Sandbox Code Playgroud)

我不希望res1成为一个对象,而是一个结果的迭代器。如何db.run在 ES7/ES8 中异步/等待查询结果?

小智 6

对我来说,最简单的解决方案是将操作封装在 Promise 中,如下所示:

const res = await new Promise((resolve, reject) => {
    db.each('SELECT id FROM table', [], (err, row) => {
        if (err)
            reject(err)

        resolve(row)
    })
})

console.log(res)
Run Code Online (Sandbox Code Playgroud)

这样,您将在回调之外同步获得row结果。res


Met*_*bre 5

我尝试过 sqlite npm 包,它通过 splite3 实现 async/await,但它不是那么好用。

一个简单的方法是创建一个小模块并传播主要的 sqlite3 功能。

这是我为 Discord 聊天机器人数据库创建的简单模块:

const sqlite3 = require('sqlite3');
const util    = require('util');

let db = new sqlite3.Database('./db/chatbot.sqlite3', sqlite3.OPEN_READWRITE, (err) => {
    if (err) {
        console.error(err.message);
    }
    console.log('Connected to the chatbot database.');
});

db.run = util.promisify(db.run);
db.get = util.promisify(db.get);
db.all = util.promisify(db.all);

// empty all data from db
db.clean_db = async function() {
  await db.run("delete from users");
  await db.run("delete from members");
  await db.run("delete from guilds");
  db.run("vacuum");
}

// any kind of other function ...

// and then export your module

module.exports = db;
Run Code Online (Sandbox Code Playgroud)

如何使用 - 现在您可以在代码中使用这样的模块:

const db = require('./db');

// get one user
const myUser = await db.get("select * from users where id = ?", [id]);
if (! myUser)
    return console.log("User with id", id, "not found");

// get all users
const users = await db.all("select * from users");
users.map((user) => { console.log(user.id, "/", user.name); });

// ... etc ...
Run Code Online (Sandbox Code Playgroud)


Mit*_*ops 3

尝试使用 sqlite 包,而不是演示中使用的 sqlite3。它对异步等待有更好的支持。