You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行JavaScript迁移后SQLite3数据库为空问题求助

问题与解决方案

问题代码

用户提供的db.js代码如下:

const sqlite3 = require('sqlite3').verbose();
const path = require('path')
const { migrationScript } = require('../db/migrations/migrate');
const WDIR = process.cwd();
const DB_PATH = path.join(WDIR, 'db', 'DB.db');

const db = new sqlite3.Database(DB_PATH, (err) => {if (err) { console.log(err);}});
db.run(migrationScript, (err) => {if (err) { console.log(err);}})
db.close()

问题现象

执行代码后仅生成0KB的DB.db文件,无任何表结构,且未抛出错误。即使添加PRAGMA foreign_keys = on或用serialize包裹操作,问题依然存在,迁移脚本未执行。

原因分析

sqlite3的API是异步非阻塞的,db.run()发起迁移操作后,代码会立刻执行后续的db.close(),此时迁移脚本还未完成执行就被关闭了数据库连接,导致数据库文件没有被写入任何内容。

解决方法

方法1:将db.close()放入db.run()的回调中

确保迁移操作完成后再关闭连接:

const sqlite3 = require('sqlite3').verbose();
const path = require('path')
const { migrationScript } = require('../db/migrations/migrate');
const WDIR = process.cwd();
const DB_PATH = path.join(WDIR, 'db', 'DB.db');

const db = new sqlite3.Database(DB_PATH, (err) => {
  if (err) { 
    console.log(err);
  }
});

db.run(migrationScript, (err) => {
  if (err) { 
    console.log(err);
  }
  // 迁移完成后关闭连接
  db.close((closeErr) => {
    if (closeErr) {
      console.log('数据库关闭失败:', closeErr);
    }
  });
});

方法2:用Promise+async/await封装异步操作

让代码逻辑更清晰,避免回调嵌套:

const sqlite3 = require('sqlite3').verbose();
const path = require('path')
const { migrationScript } = require('../db/migrations/migrate');
const WDIR = process.cwd();
const DB_PATH = path.join(WDIR, 'db', 'DB.db');

// 封装db.run为Promise
const runMigration = (db, script) => {
  return new Promise((resolve, reject) => {
    db.run(script, err => err ? reject(err) : resolve());
  });
};

const initDB = async () => {
  const db = new sqlite3.Database(DB_PATH, err => {
    if (err) console.log('数据库连接失败:', err);
  });

  try {
    await runMigration(db, migrationScript);
    console.log('迁移执行成功');
  } catch (err) {
    console.log('迁移执行失败:', err);
  } finally {
    db.close(closeErr => {
      if (closeErr) console.log('数据库关闭失败:', closeErr);
    });
  }
};

initDB();

内容的提问来源于stack exchange,提问作者Daniel Rosenberg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 12:12:40