<Sqlite><websocket>使用Sqlite与websocket,实现网页端对数据库的【读写增删】操作

前言
本文是在websocket进行通讯的基础,添加数据库进行数据的存储,数据库软件使用的是sqlite。

环境配置
系统:windows
平台:visual studio code
语言:javascript、html
库:nodejs、sqlite

概述
此前,我们实现在利用websocket和socket,将网页端与下位控制器如PLC进行数据通讯的方法,现在,我们来更加前进一步,假设我们的设备现场有一些生产数据,除了发送到网页端显示,还需要存储起来,这时我们就需要使用数据库,将接收到的现场数据保存,以便于随时读取和修改。这就是我们这篇文章要实现的功能。

前提条件
需要提前安装sqlite、nodejs
1、sqlite安装:
去sqlite官网下载windows下的预编译文件,解压后为其文件夹路径配置环境变量。然后在vscode的终端,使用:npm install sqlite3来为项目安装sqlite3模块。
2、nodejs安装
去nodejs官网下载安装软件,尽量选择最新的版本。nodejs安装时,勾选自动下载需要的插件,否则你在使用nodejs的过程,很可能会遇到各种问题。如果nodejs自动安装插件过程遇到问题,比如PowerShell报错,类似下面这样:

choco : 无法将“choco”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正
确,然后再试一次。
所在位置 行:1 字符: 176

  • … .DownloadString(‘https://chocolatey.org/install.ps1’)); choco upgrade …
  •                                                         ~~~~~
    
    • CategoryInfo : ObjectNotFound: (choco:String) [], CommandNotFoundException
    • FullyQualifiedErrorId : CommandNotFoundException

那么,你可以按照以下步骤处理:
1、先退出PowerShell,然后以管理员模式重新启动PowerShell,输入以下指令:

set-executionpolicy remotesigned

然后在弹出的选项中,输入:Y
然后输入指令:

iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex

来安装chocolatey,但是如果你已经安装了chocolatey,但是因为各种其他原因不起作用,那么最好先删除C盘下的chocolatey文件夹,然后执行以上指令,重新安装chocolatey。
完成后,再次执行nodejs的插件安装步骤,这个步骤可以随时重新启动。

代码实现
下面将一步步实现javascript与sqlite数据通讯并在网页端显示数据且操作数据的过程。

Step1、实现网页端websocket通讯

此处不再赘述,可以参看我之前的博文或者网络上搜寻,亦或是借助AI。
相关博文链接
<javascript><node.js><websocket>使用node.js创建websocket服务器,与网页端websocket客户端进行数据通讯,且创建windows批处理程序一键启动

Step2、实现javascript与sqlite数据库通讯

要实现javascript与sqlite通讯,需要先安装sqlite3模块:

npm install sqlite3

然后我们创建一个server.js文件,首先要引用ws和sqlite3模块:

const WebSocket = require('ws');
const sqlite3 = require('sqlite3').verbose();

然后,先创建ws即websocket连接,在websocket的连接中,加入对数据库的操作。为了方便,我们可以先将数据库的操作封装为函数,写在单独的文件中,然后导出接口即可。
所以,我们创建一个sqlitedb.js,在里面封装以下函数:

module.exports ={
   
    getalldata,
    insertdata,
    deletedata,
    closedb,
};

一共四个函数,分别是:
getalldata:用于获取数据库的所有数据
inserdata:用于向数据库插入数据
deletedata:用于向数据库删除数据
closedb:用于关闭数据库连接
代码如下:
sqlitedb.js

const sqlite3=require('sqlite3').verbose();
let db=new sqlite3.Database('E:\\100 htmlcss\\websql\\mydb.db');//将路径修改为你的实际数据库文件路径

/**
 * 获取数据库数据
 * @param {*} callback 
 */
function getalldata(callback){
   
    db.all("SELECT * FROM mytable",(err,rows)=>{
   
        if (err){
   
            callback(err,null);
        } else {
   
            callback(null,rows);
        }
    });
}

/**
 * 插入数据库数据
 * @param {*} data 
 * @param {*} callback 
 */
function insertdata(data,callback){
   
    //console.log(data);
    const stmt =db.prepare("INSERT INTO mytable (编号,UID,状态) VALUES (?,?,?)");
    stmt.run(data.name,data.value,data.status,(err) => {
   
        if (err){
   
            callback(err,null);
        } else {
   
            //console.log('插入成功');
            callback(null,'ok');
            stmt.finalize();
        }
    })
}


/**
 * 删除数据库数据
 * @param {*} id 
 * @param {*} callback 
 */
function deletedata(num,callback){
   
    const sqlite3="DELETE FROM mytable WHERE 编号=?";
    db.run(sqlite3,[num],function(err){
   
        if (err){
   
            return callback(err,null);
        } 
        const changes=this.changes;
        callback(null,changes)
    }
    )
}

要注意的是数据库文件的路径,可以使用Navicat工具来操作数据库,比较方便。
Navicat官网链接:https://www.navicat.com.cn/

然后在server.js中导入以上接口函数:

const {
    getalldata,insertdata,deletedata } =require('./sqlitedb');
Step3、数据库的读写增删

本文的核心是与数据库进行通讯,这里我们简单说一下逻辑。
我们的设计是通过网页端对数据库进行读取,通过getalldata函数获取当前数据库文件中的所有项,然后通过websocket服务端转发给websocket客户端,即网页端,网页端获取到了数据后,动态添加到页面上,以表格形式,如下:
在这里插入图片描述
当我们正确显示了数据库的数据后,我们还希望能够在网页端对数据进行操作,然后同步到数据库。
如我们在网页端删除某一行数据,点击删除按钮后,发送删除请求给websock服务端,websocket服务端接收到信息后,根据客户端发送的数据id,对数据库进行删除操作,删除成功后,返回信息,同时重新获取数据库数据,然后更新页面。
以此类推,插入新数据的操作也是一致的。
对于网页端,我们为页面设计了简单的布局,如上图所示,其html代码如下(供参考):
index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>WebSocket Client</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <h1>Sqlite数据库读写页面</h1>

  <!-- 添加插入数据按钮与输入框 -->

  <div>
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/921464.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unreal从入门到精通之如何绘制用于VR的3DUI交互的手柄射线

文章目录 前言实现方式MenuLaser实现步骤1.Laser和Cursor2.移植函数3.启动逻辑4.检测射线和UI的碰撞5.激活手柄射线6.更新手柄射线位置7.隐藏手柄射线8.添加手柄的Trigger监听完整节点如下:效果图前言 之前我写过一篇文章《Unreal5从入门到精通之如何在VR中使用3DUI》,其中讲…

主IP地址与从IP地址:深入解析与应用探讨

在互联网的浩瀚世界中&#xff0c;每台联网设备都需要一个独特的身份标识——IP地址。随着网络技术的不断发展&#xff0c;IP地址的角色日益重要&#xff0c;而“主IP地址”与“从IP地址”的概念也逐渐进入人们的视野。这两个术语虽然看似简单&#xff0c;实则蕴含着丰富的网络…

【Linux】文件IO的系统接口 | 文件标识符

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 最近真的任务拉满了&…

时序论文23|ICML24谷歌开源零样本时序大模型TimesFM

论文标题&#xff1a;A DECODER - ONLY FOUNDATION MODEL FOR TIME - SERIES FORECASTING 论文链接&#xff1a;https://arxiv.org/abs/2310.10688 论文链接&#xff1a;https://github.com/google-research/timesfm 前言 谷歌这篇时间序列大模型很早之前就在关注&#xff…

OpenAI 助力数据分析中的模式识别与趋势预测

数据分析师的日常工作中&#xff0c;发现数据中的隐藏模式和预测未来趋势是非常重要的一环。借助 OpenAI 的强大语言模型&#xff08;如 GPT-4&#xff09;&#xff0c;我们可以轻松完成这些任务&#xff0c;无需深厚的编程基础&#xff0c;也能快速上手。 在本文中&#xff0…

基于深度学习的点云分割网络及点云分割数据集

点云分割是根据空间、几何和纹理等特征对点云进行划分&#xff0c;使得同一划分内的点云拥有相似的特征。点云的有效分割是许多应用的前提&#xff0c;例如在三维重建领域&#xff0c;需要对场景内的物体首先进行分类处理&#xff0c;然后才能进行后期的识别和重建。 传统的点…

快速图像识别:落叶植物叶片分类

1.背景意义 研究背景与意义 随着全球生态环境的变化&#xff0c;植物的多样性及其在生态系统中的重要性日益受到关注。植物叶片的分类不仅是植物学研究的基础&#xff0c;也是生态监测、农业管理和生物多样性保护的重要环节。传统的植物分类方法依赖于人工观察和专家知识&…

MySQL 没有数据闪回?看 zCloud 如何补齐MySQL数据恢复能力

ENMOTECH 上一篇文章为大家介绍了某金融科技企业通过 zCloud 多元数据库智能管理平台的告警中心“警警”有条地管理告警并进行敏捷处置的实践案例。本篇跟大家继续分享该案例客户如何利用 zCloud 备份恢复模块下的Binlog解析功能补齐 MySQL 数据恢复能力&#xff0c;让运维人员…

transformer.js(四): 模型接口介绍

前面的文章底层架构及性能优化指南介绍了transformer.js的架构和优化策略&#xff0c;在本文中&#xff0c;将详细介绍 transformer.js 的模型接口&#xff0c;帮助你了解如何在 JavaScript 环境中使用这些强大的工具。 推荐阅读 ansformer.js&#xff08;二&#xff09;&…

使用 Elasticsearch 构建食谱搜索(二)

这篇文章是之前的文章 “使用 Elasticsearch 构建食谱搜索&#xff08;一&#xff09;” 的续篇。在这篇文章中&#xff0c;我将详述如何使用本地 Elasticsearch 部署来完成对示例代码的运行。该项目演示了如何使用 Elastic 的 ELSER 实现语义搜索并将其结果与传统的词汇搜索进…

1、HCIP之RSTP协议与STP相关安全配置

目录 RSTP—快速生成树协议 STP STP的缺点&#xff1a; STP的选举&#xff08;Listening状态中&#xff09;&#xff1a; RSTP P/A&#xff08;提议/同意&#xff09;机制 同步机制&#xff1a; 边缘端口的配置&#xff1a; RSTP的端口角色划分&#xff1a; ensp模拟…

hhdb数据库介绍(9-21)

计算节点参数说明 checkClusterBeforeDnSwitch 参数说明&#xff1a; PropertyValue参数值checkClusterBeforeDnSwitch是否可见否参数说明集群模式下触发数据节点高可用切换时&#xff0c;是否先判断集群所有成员正常再进行数据节点切换默认值falseReload是否生效是 参数设…

java基础概念38:正则表达式3-捕获分组

一、定义 分组就是一个小括号。 分组的特点&#xff1a; 二、捕获分组 捕获分组就是把这一组的数据捕获出来&#xff0c;再用一次。 后续还要继续使用本组的数据。 正则内部使用&#xff1a;\\组号正则外部使用&#xff1a;$组号 2-1、正则内部使用&#xff1a;\\组号 示…

使用Mac下载MySQL修改密码

Mac下载MySQL MySQL官网链接MySQL​​​​​​ 当进入到官网后下滑到community社区&#xff0c;进行下载 然后选择community sever下载 这里就是要下载的界面&#xff0c;如果需要下载之前版本的话可以点击archives&#xff0c; 可能会因为这是外网原因&#xff0c;有时候下…

【初阶数据结构篇】队列的实现(赋源码)

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

【云计算】腾讯云架构高级工程师认证TCP--考纲例题,知识点总结

【云计算】腾讯云架构高级工程师认证TCCP–知识点总结&#xff0c;排版整理 文章目录 1、云计算架构概论1.1 五大版块知识点&#xff08;架构设计&#xff0c;基础服务&#xff0c;高阶技术&#xff0c;安全&#xff0c;上云&#xff09;1.2 课程详细目录1.3 云基础架构设计1.4…

AR智能眼镜|AR眼镜定制开发|工业AR眼镜方案

AR眼镜的设计与制造成本主要受到芯片、显示屏和光学方案的影响&#xff0c;因此选择合适的芯片至关重要。一款优秀的芯片平台能够有效提升设备性能&#xff0c;并解决多种技术挑战。例如&#xff0c;采用联发科八核2.0GHz处理器&#xff0c;结合12nm制程工艺&#xff0c;这种低…

大数据新视界 -- 大数据大厂之 Impala 性能优化:集群资源动态分配的智慧(上)(23 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

代理池搭建优化-(书接上回,优化改进)

炮台有效炮弹实现 声明 学习视频来自 B 站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 ✍&#x1f3fb;作者…

光伏业务管理系统能解决光伏企业什么问题?

随着技术进步和市场规模的扩大&#xff0c;光伏企业面临着日益复杂的管理挑战&#xff0c;包括但不限于项目监管、运维管理、供应链优化、客户管理以及数据分析决策等方面。为了解决这些挑战&#xff0c;光伏业务管理系统应运而生&#xff0c;成为提升光伏企业运营效率、降低成…