执行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
相关产品推荐
相关产品推荐

