使用better-sqlite3获取表默认值返回undefined的问题求助
如何正确设置并获取SQLite表的默认值?
问题核心原因
你遇到的全字段返回undefined问题,主要来自三个关键错误:
- 表内无数据:字段默认值仅在插入数据且未指定对应字段时生效,你创建表后未插入任何记录,查询自然无结果。
- SQL语法错误:SQLite不支持
DEFAULT undefined,对于REAL类型的serverTimeout,需改为DEFAULT NULL或合法数值(如0.0)。 - 查询未执行:
SettingsDB.prepare()仅创建查询语句对象,未实际执行查询,需调用.get()(单条)或.all()(多条)方法才能获取结果。
修正后的完整代码
1. 修正表创建语句
import Database from 'better-sqlite3-multiple-ciphers' import fs from 'fs' import path from 'path' const commandToCreateJitsiSettingsTable = ` CREATE TABLE IF NOT EXISTS jitsiTable ( id INTEGER PRIMARY KEY AUTOINCREMENT, alwaysOnTopWindowEnable INTEGER NOT NULL DEFAULT 1, disableAGC INTEGER NOT NULL DEFAULT 0, serverURL TEXT, serverTimeout REAL DEFAULT NULL, created_at timestamp NOT NULL DEFAULT current_timestamp, updated_at timestamp NOT NULL DEFAULT current_timestamp ) `
2. 初始化表并插入默认数据
if (!fs.existsSync(path.join(settingsUserDataFolder, "Settings.db"))) { // 补全缺失的括号 const SettingsDB = new Database(path.join(settingsUserDataFolder,"Settings.db"), {}) SettingsDB.pragma('journal_mode = WAL') SettingsDB.pragma("rekey='secret-key'"); SettingsDB.exec(commandToCreateJitsiSettingsTable) // 插入一条默认记录,自动填充所有带默认值的字段 SettingsDB.prepare(`INSERT INTO jitsiTable DEFAULT VALUES`).run() SettingsDB.close(); }
3. 正确执行查询
else { console.log("Settings.db already exists") const SettingsDB = require('better-sqlite3-multiple-ciphers')(path.join(settingsUserDataFolder,"Settings.db"), {}) SettingsDB.pragma("key='secret-key'"); // 执行查询并获取单条记录 const row = SettingsDB.prepare("SELECT * FROM jitsiTable").get(); console.log(row.alwaysOnTopWindowEnable, row.disableAGC, row.serverURL, row.serverTimeout, row.created_at, row.updated_at) SettingsDB.close(); }
补充说明
- 若需要多配置记录,可将查询方法改为
.all(),并调整插入逻辑支持多条数据。 - SQLite的
current_timestamp会自动填充当前时间,无需额外处理时间字段。
内容的提问来源于stack exchange,提问作者Raphael10
相关产品推荐
相关产品推荐

