我正在尝试在我的 Angular + Electron 应用程序中使用 node-sqlite3 打开 sqlite 数据库文件。
尽管我确保该文件存在并且 Electron 可以读取它,但当我尝试使用以下命令创建 sqlite 数据库时:
import * as sqlite from 'sqlite3';
// ...
const path = `${__dirname}/assets/sqlite.db`;
const fs = require('electron').remote.require('fs');
console.log(path);
if (fs.existsSync(AppConfig.sqlitePath)) {
console.log('the file exists');
} else {
console.log('the file does not not');
}
const myDb = new sqlite.Database(path, sqlite.OPEN_READONLY, (error) => {
console.log(error);
});
Run Code Online (Sandbox Code Playgroud)
该文件存在,因为我收到了正确的console.log消息,它看起来像:
/tmp/.mount_xxxxxx/resources/app.asar.unpacked/dist/assets/sqlite.db
Run Code Online (Sandbox Code Playgroud)
但是,new sqlite.Database(...)我收到以下错误,因为该文件不存在:
错误:SQLITE_CANTOPEN:无法打开数据库文件
我的问题是弄清楚何时关闭从expressjs后端到sqlite数据库的数据库连接.
我基本上想要实现的是一个数据库连接,它在整个服务器正常运行期间打开,并在服务器关闭时关闭.
var express = require('express')
var app = express()
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(data/Test.db);
//use db as needed
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("Example app listening at http://%s:%s", host, port)
});
//on shutdown db.close();
Run Code Online (Sandbox Code Playgroud)
我看了看这些威胁:
堆栈溢出:process.on('exit',callback)
但是如果我用快速服务器杀了我,建议的解决方案对我不起作用ctrl+c.
那么关于如何在服务器关闭时处理开放数据库连接的"最佳实践"是什么?
我试图从我之前输入的sqlite3数据库中获取所有/多行数据,并确保它(数据)存在.使用db数据库对象,我的尝试看起来像这样:
db.get
(
'SELECT * FROM my_table',
(err, rows) =>
{
if(rows && err === null)
{
console.log(rows);
}
else
{
console.log('Error', err);
}
}
)
Run Code Online (Sandbox Code Playgroud)
以上始终返回包含1行数据的单个对象.
最近,我注意到控制台中出现黄色警告:
sqlite3不支持.returning(),因此不会有任何效果。
我正在使用该sqlite3模块knex.js。它对输出没有任何影响,但知道它的价值非常重要。这是我的环境详细信息。
knex v0.19.1
sqlite3 v4.0.9
Node v10.16.9
electro-builder v21.2.0
electro v6.0.2
我正在使用 node-sqlite3 在 node.js 中解决一些基本的异步/等待问题。
我的目标是从 SQLite DB 中选择一些值,检查它的某些条件并在满足条件时采取一些措施。这是代码:
const sqlite3 = require('sqlite3').verbose();
main();
async function main() {
let ordersDb = await createDbConnection('./ProcessedOrders.db');
var orderProcessed = await orderAlreadyProcessed(ordersDb, "555");
console.log("orderProcessed = " + orderProcessed);
if (!orderProcessed) {
console.log("So condition is met!");
}
}
async function orderAlreadyProcessed(ordersDb, orderNumberStr) {
console.log('starting orderAlreadyProcessed function'); //DEBUG
var result;
var query = 'select count(SoldOrderNumber) as "recsCount" from ProcessedSoldOrders where SoldOrderNumber = ?;';
await ordersDb.get(query
,[orderNumberStr]
,(err, row) => {
console.log('Row with count = ' + …Run Code Online (Sandbox Code Playgroud) 所以我尝试根据用户输入选择行,如下所示:
db.all(
'SELECT * FROM houses WHERE location LIKE "%$input%"',
{
$input: name,
},
(error, rows) => {
res.send(rows);
}
);
Run Code Online (Sandbox Code Playgroud)
但是,数据库以未定义的值进行响应。我能做些什么?
我意识到,当我在 Electron JS 中使用 knex (使用 sqlite3)更新查询时,查询完成后,渲染器进程会自动刷新!例如:
索引.html:
ipc.send('UpdateTheRow', {'Id': 1, 'Title': 'foo', 'Date': '01-01-2020'});
Run Code Online (Sandbox Code Playgroud)
main.js
ipcMain.on('UpdateTheRow', (event, newData)=>{
knex('Products').where({id: newData.Id}).update({
title: newData.Title,
enter_date: newData.Date
}).then(function (res) {
console.log(res);
});
});
Run Code Online (Sandbox Code Playgroud)
运行更新请求后,控制台打印 Response ,但渲染器刷新!
换句话说,当我们做这样的事情时:
在 Main.js 中使用以下命令重新获取 console.log:
indexPage.webContents.send("EditedTheRow", res);
Run Code Online (Sandbox Code Playgroud)
在index.html中
:
ipc.on('EditedTheRow', (event, response) => {
alert('Updated');
}
Run Code Online (Sandbox Code Playgroud)
查询工作正常,但我们在渲染器中没有收到任何警报!
抱歉我的英语不好。
node-sqlite3 ×7
node.js ×7
electron ×3
javascript ×3
sqlite ×3
knex.js ×2
angular ×1
async-await ×1
asynchronous ×1
express ×1
sql ×1
sql-like ×1