首页 > 数据库 >SQL.js -- 操作sqlite数据库

SQL.js -- 操作sqlite数据库

时间:2023-03-28 09:36:57浏览次数:49  
标签:sqlite -- 数据库 SQLite js sql var con

js读写sqlite

JavaScript 是一种在浏览器中运行的脚本语言,无法直接读写 SQLite 数据库。不过,你可以使用一些 JavaScript 库或框架来操作 SQLite 数据库,例如 SQLite.js 和 sql.js。

SQLite.js 是一个使用 JavaScript 实现的 SQLite 数据库,可以在浏览器环境中使用。它可以让你在浏览器中创建、打开、查询和修改 SQLite 数据库。使用 SQLite.js,你可以将 SQLite 数据库文件上传到服务器,然后使用 JavaScript 代码在浏览器中操作该文件。

sql.js 也是一个使用 JavaScript 实现的 SQLite 数据库,但与 SQLite.js 不同,它是完全在客户端中运行的。它使用 Emscripten 将 C/C++ 代码编译成 JavaScript 代码,从而实现了在浏览器中运行 SQLite 数据库的功能。使用 sql.js,你可以直接将 SQLite 数据库文件打包到你的网站中,并使用 JavaScript 代码在浏览器中操作该文件。

总的来说,如果你需要在浏览器中操作 SQLite 数据库,可以考虑使用 SQLite.js 或 sql.js。这两个库都提供了方便易用的 API,可以让你轻松地在浏览器中读写 SQLite 数据库。

 

 

出处:https://juejin.cn/s/js%E8%AF%BB%E5%86%99sqlite

======================================================================================

js -- 操作sqlite数据库

最近看到一个使用js来操作sqlite数据库的,测试了一下,具体使用的是

js操作类: https://github.com/kripken/sql.js/(sqlite js 驱动)

异步请求:http://npm.taobao.org/package/axios(异步请求插件,只有12.6k)

这里使用的js驱动是和服务器端使用方法一致,sql标准语法都支持,可以用第三方管理工具来管理数据文件

目前我使用的是 Navicat Premium 12

下面是测试的源代码:

1. 数据库sql

自己运行生成test.db,和html页面放在同一目录下:

PRAGMA foreign_keys = false;

-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS "sys_user";
CREATE TABLE "sys_user" (
  "id" bigint(11) NOT NULL,
  "role_id" bigint(11) NOT NULL,
  "user_name" varchar(255) NOT NULL,
  "user_pass" varchar(64) NOT NULL,
  "nick_name" varchar(255) NOT NULL,
  "register_time" datetime NOT NULL,
  "status" int(11) NOT NULL DEFAULT 1,
  "sort" decimal(16,2) NOT NULL DEFAULT 0.00,
  PRIMARY KEY ("id")
)
WITHOUT ROWID;

-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO "sys_user" VALUES (1, 1, 'lxw', 123456, '李兴武', '2019-01-07 11:22:30', 0, 1);
INSERT INTO "sys_user" VALUES (2, 1, 'lwq', 123456, '浏览器', '2019-01-08 11:11:11', 0, 2);
INSERT INTO "sys_user" VALUES (3, 1, 'tjun', 123123, '田俊', '2018-01-01 12:22:35', 1, 3);
INSERT INTO "sys_user" VALUES (4, 1, 'tttt', 123456, '通天塔', '', 1, 4);

-- ----------------------------
-- Indexes structure for table sys_user
-- ----------------------------
CREATE UNIQUE INDEX "pk"
ON "sys_user" (
  "id" COLLATE BINARY ASC
);

PRAGMA foreign_keys = true;

2. html(可直接复制下来运行)

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>sqlite数据库测试</title>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="https://cdn.bootcss.com/sql.js/0.5.0/js/sql-optimized.js"></script>
</head>
<body>

<p>sqlite数据库测试,使用js操作sqlite数据库</p>
<p>这里使用axios读取test.db文件,进行初始化数据库连接,</p>
<p>查询速度不快,除非不想写后台要直接操作数据库,不然没什么用。</p>
<p>具体效果可查看代码和控制台打印的数据。</p>

<script>

    // 读取数据库数据
    axios.get("test.db", {responseType: 'arraybuffer'})
        .then(function (response) {
            let db = new window.SQL.Database(new Uint8Array(response.data));
            // 执行查询
            let s = new Date().getTime();
            let r = db.exec("SELECT * FROM sys_user WHERE status = 1;");
            let e = new Date().getTime();
            console.info("查询数据耗时:" + (e - s) + "ms");
            // 解析数据
            let obj = dbToObj(r);
            console.info(obj);
        })
        .catch(function (error) {
            console.info(error);
        });

    // 方法传入两个数组,第一个数组为key,第二个数组对应位置为value,此方法在Python中为zip()函数。
    const ArraytoObj = (keys = [], values = []) => {
        if (keys.length === 0 || values.length === 0) return {};
        const len = keys.length > values.length ? values.length : keys.length;
        const obj = {};
        for (let i = 0; i < len; ++i) {
            obj[keys[i]] = values[i]
        }
        return obj;
    };

    // 转驼峰表示:func.camel('USER_ROLE',true) => UserRole
    // 转驼峰表示:func.camel('USER_ROLE',false) => userRole
    const camel = (str, firstUpper = false) => {
        let ret = str.toLowerCase();
        ret = ret.replace(/_([\w+])/g, function (all, letter) {
            return letter.toUpperCase();
        });
        if (firstUpper) {
            ret = ret.replace(/\b(\w)(\w*)/g, function ($0, $1, $2) {
                return $1.toUpperCase() + $2;
            });
        }
        return ret;
    };

    // 把数组里面的所有转化为驼峰命名
    const camelArr = (arrs = []) => {
        let _arrs = [];
        arrs.map(function (item) {
            _arrs.push(camel(item));
        });
        return _arrs;
    };

    // 读取数据库
    // 1.把columns转化为驼峰;
    // 2.把columns和values进行组合;
    const dbToObj = (_data = {}) => {
        let _res = [];
        _data.map(function (item) {
            let _columns = camelArr(item.columns);
            item.values.map(function (values) {
                _res.push(ArraytoObj(_columns, values));
            });
        });
        return _res;
    };
</script>
</body>
</html>

 

 

出处:https://www.cnblogs.com/lixingwu/p/10236640.html

=======================================================================================

从JavaScript访问SQLite3数据库

比较好的解决方案为使用sql.js

For the impatients, try the demo here: http://kripken.github.io/sql.js/GUI/

sql.js is a port of SQLite to JavaScript, by compiling the SQLite C code with Emscripten. It uses a virtual database file stored in memory, and thus does’nt persist the changes made to the database. However, it allows you to import any existing sqlite file, and to export the created database as a javascript typed array.

There is no C bindings or node-gyp compilation here, sql.js is a simple javascript file, that can be used like any traditional javascript library. If you are building a native application in javascript (using Electron for instance), or are working in node.js, you will likely prefer to use a native binding of SQLite to javascript.

SQLite is public domain, sql.js is MIT licensed.

以下是待验证的使用:

var db = SQL.open();
var data = db.exec(command);

详细使用方案见用JavaScript操作SQLite文件

还有一篇文章也不错
其中详细说明了怎么连接自己的数据库。
过去一段时间因为要弄一个有趣的CS架构程序,需要找一个文件型数据库,最后决定用sqlite3数据库。但是js连接sqlite3 数据库伤透了脑筋。使用nodejs连接sqlite数据库但是node的ABI与node-webkit的ABI对不上号,就快在崩溃的边缘时找到了一个比较好的连接sqlite3数据库的工具sql.js。从此变得一发不可收拾。
sql.js下载地址:https://github.com/kripken/sql.js
下面是使用sql.js写的一个demo:
需在页面上导入sql.js

         function test()

        {
            var fs = require("fs");
            //Create the database
            var db = new SQL.Database();
            // NOTE: You can also use new sql.Database(data) where
            // data is an Uint8Array representing an SQLite database file
            // Execute some sql
            sqlstr = "CREATE TABLE hello (a int, b char);";
            sqlstr += "INSERT INTO hello VALUES (0, 'hello');"
            sqlstr += "INSERT INTO hello VALUES (1, 'world');"
            db.run(sqlstr); // Run the query without returning anything
            var res = db.exec("SELECT * FROM hello");
               // Prepare an sql statement
            var stmt = db.prepare("SELECT * FROM hello WHERE a=:aval AND b=:bval");
            // Bind values to the parameters and fetch the results of the query
            var result = stmt.getAsObject({':aval' : 1, ':bval' : 'world'});
            alert(result); // Will print {a:1, b:'world'}
            // Bind other values
            stmt.bind([0, 'hello']);
            while (stmt.step()) alert(stmt.get()); // Will print [0, 'hello']
            // free the memory used by the statement
            stmt.free();
            // You can not use your statement anymore once it has been freed.
            // But not freeing your statements causes memory leaks. You don't want that.
            // Export the database to an Uint8Array containing the SQLite database file
            var binaryArray = db.export();
            var buffer = new Buffer(binaryArray);
            fs.writeFileSync("filename.sqlite", buffer);
        }

也可以使用自己新建的sqlite数据库文件
导入方式:

   var fs =require('fs');
    var filebuffer=fs.readFileSync('test.sqlite');// Load the db
    var db= new  SQL.Database(filebuffer);

    // Exportthe database to an Uint8Array containing the SQLite databasefile
       varbinaryArray = db.export();
       var buffer =new Buffer(binaryArray);
      fs.writeFileSync("test.sqlite", buffer);

 

出处:https://www.jianshu.com/p/364740cf6b75

======================================================================================

javascript读写本地sqlite数据库

sqlite这种单文件数据库,类型简单功能强大效率也不错,非常适合单机软件开发。

把一个我以前写的JavaScript sqlite数据库操作类分享给大家,还是先上代码,注释写的很清楚啦,支持增删改查,支持链式查询,使用的时候不用new。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*sqlite数据库操作类 by sdxjwkq01*/
this.Db={
    tableName:"",//表
    whereReg:"",//where条件
    orderReg:"",//排序条件
    pageReg:"",//分页
    dbUrl:"DRIVER=SQLite3 ODBC Driver;Database=Db/database.db",//数据库地址
    //取得表
    table:function(tableName){
        this.tableName=tableName;
        return this;
    },
    //取得where
    where:function(whereReg){
        this.whereReg=whereReg;
        return this;
    },
    //排序
    order:function(orderReg){
        this.orderReg=orderReg;
        return this;
    },
    //分页
    page:function(pageReg){
        this.pageReg=pageReg;
        return this;
    },
    //添加
    add:function(json){
        var sql="insert into "+this.tableName+"(";
        var fields=[];
        var values=[];
        for(var item in json){
            fields.push(item);
            values.push("'"+json[item]+"'");
        }
        sql+=fields.join(",");
        sql+=") values("+values.join(",")+")";
        var con = new ActiveXObject("ADODB.Connection");
        con.ConnectionString =this.dbUrl;
        con.Open();
        con.Execute(sql);
        con.Close();
    },
    //删除
    del:function(id){
        var con = new ActiveXObject("ADODB.Connection");
        con.ConnectionString = this.dbUrl;
        con.Open();
        if(typeof id=="object"){
            con.Execute("delete from "+this.tableName+" where id in ("+id.join(",")+")");
        }else{
            con.Execute("delete from "+this.tableName+" where id="+id);
        }
        con.Close();
    },
    //修改
    upd:function(json){
        var sql="update "+this.tableName+" set ";
        var data=[];
        for(var item in json){
            data.push(item+"="+json[item]);
        }
        sql+=data.join(",");
        if(this.whereReg.length>0){
            sql+=" where "+this.whereReg;
        }
        var con = new ActiveXObject("ADODB.Connection");
        con.ConnectionString =this.dbUrl;
        con.Open();
        var re=con.Execute(sql);
        con.Close();
    },
    //查询
    sel:function(){
        var con = new ActiveXObject("ADODB.Connection");
        con.ConnectionString =this.dbUrl;
        con.Open();
        var sql="";
        sql+="select * from "+this.tableName;
        if(this.whereReg.length>0){
            sql+=" where "+this.whereReg;
        }
        if(this.orderReg.length>0){
            sql+=" order by "+this.orderReg;
        }
        if(this.pageReg.length>0){
            var limit=this.pageReg.split(",");
            sql+=" limit "+limit[0]+" offset "+limit[1];
        }
        var result=con.Execute(sql);
        var resultArray=[];
        var h=0;
        while(!result.eof){
            if(h==0){
                //试探指针位置
                for(i=0;;i++){
                    try{
                        eval("var temp=result("+i+")");
                    }catch(e){
                        var fieldLength=i;
                        break;
                    }
                }
                h++;
            }
            var temp=[];
            for(i=0;i<fieldLength;i++){
                eval("temp.push(''+result("+i+"))");
            }
            resultArray.push(temp);
            result.movenext();
        }
        con.Close();
        return resultArray;
    },
    //直接执行
    execute:function(sql){
        var con = new ActiveXObject("ADODB.Connection");
        con.ConnectionString =this.dbUrl;
        con.Open();
        var result=con.Execute(sql);
        var resultArray=[];
        var h=0;
        while(!result.eof){
            if(h==0){
                //试探指针位置
                for(i=0;;i++){
                    try{
                        eval("var temp=result("+i+")");
                    }catch(e){
                        var fieldLength=i;
                        break;
                    }
                }
                h++;
            }
            var temp=[];
            for(i=0;i<fieldLength;i++){
                eval("temp.push(''+result("+i+"))");
            }
            resultArray.push(temp);
            result.movenext();
        }
        con.Close();
        return resultArray;
    }
}

例如下面是更新一条数据

 

<iframe data-google-container-id="a!3" data-google-query-id="COHB7uK6_f0CFRTTlgod0uYJjw" data-load-complete="true" frameborder="0" height="0" id="aswift_2" marginheight="0" marginwidth="0" name="aswift_2" scrolling="no" src="https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-1776224780566592&output=html&h=187&slotname=3590016480&adk=3379674866&adf=2435605481&pi=t.ma~as.3590016480&w=748&fwrn=4&lmt=1679966464&rafmt=11&format=748x187&url=https%3A%2F%2Fwww.codenong.com%2Fcs105185005%2F&wgl=1&uach=WyJXaW5kb3dzIiwiOC4wLjAiLCJ4ODYiLCIiLCIxMDkuMC41NDE0LjEyMCIsW10sZmFsc2UsbnVsbCwiNjQiLFtbIk5vdF9BIEJyYW5kIiwiOTkuMC4wLjAiXSxbIkdvb2dsZSBDaHJvbWUiLCIxMDkuMC41NDE0LjEyMCJdLFsiQ2hyb21pdW0iLCIxMDkuMC41NDE0LjEyMCJdXSxmYWxzZV0.&dt=1679966448866&bpp=1&bdt=543&idt=239&shv=r20230323&mjsv=m202303210101&ptt=9&saldr=aa&abxe=1&cookie=ID%3D51a12dcc7dfb4744-22090a43c3dc008c%3AT%3D1679966449%3ART%3D1679966449%3AS%3DALNI_MYuoTSBKbFgopljySQubfRxBSWgtg&gpic=UID%3D00000be23b0445df%3AT%3D1679966449%3ART%3D1679966449%3AS%3DALNI_Ma0cgF2njsyOoIaV_eutvlgpwXYVA&prev_fmts=0x0%2C748x280%2C257x600%2C257x600%2C1519x722%2C180x500%2C1005x124&nras=4&correlator=8198531278188&frm=20&pv=1&ga_vid=1056574132.1679966449&ga_sid=1679966449&ga_hid=1896136453&ga_fc=1&rplot=4&u_tz=480&u_his=1&u_h=864&u_w=1536&u_ah=824&u_aw=1536&u_cd=24&u_sd=1.25&dmc=8&adx=236&ady=3541&biw=1519&bih=722&scr_x=0&scr_y=686&eid=44759875%2C44759837%2C44777877%2C44759926&oid=2&psts=AHQMDFdaB4UPVmSlfvAm1TsfH4tmzxIyKN6gy7EjCflXJ3MYp58pqqlqLQPhqbDvqTllWCb-rxeqFcqtl8RvxWd7B7RkBUTj%2CAHQMDFcky6Vm8Ya3sVxRhUa6krm5QzoJ80-prc1gjKzM4Qye_B2bpu2y9kaqIF6PoBCATT4w0vkPzxfmDW1DO7NLDs3Okztv%2CAHQMDFdX618MaIMKukNVOBejSU-KaJIO3dKXJscNerAoVcvmE2jT-CI7apANgDJt--uwvXcp1D3r-mi4mHpOf5F2weHMUhM%2CAHQMDFcDpTwfYDZAjtCm1y9PjFl_6S991hIPJjNYgEqki54QHOEgqs9wIQ9ZBDb4dg9wcaQ0VRsVvrjiWuwhE2Lfj60HFAXn-mNbFaX1YrtU4G9t_6eLcw%2CAHQMDFcZWL0JWgyeE_LTS5gGQAaqH3F4Gu6QDYbph1BJF8hV6j4rxGRGw78Evd0jAnYWZ1exHc-iceQnYzD3h60GjP0leYLrfddd5iuqfDBg9YfRN4T0Fw&pvsid=3687345278292278&tmod=1203611262&uas=0&nvt=1&ref=https%3A%2F%2Fcn.bing.com%2F&fc=1920&brdim=0%2C0%2C0%2C0%2C1536%2C0%2C1536%2C824%2C1536%2C722&vis=1&rsz=%7C%7CEebr%7C&abl=CS&pfx=0&fu=128&bc=31&ifi=3&uci=a!3&btvi=4&fsb=1&xpc=97QijbDNXp&p=https%3A//www.codenong.com&dtd=15462" style="left: 0; position: absolute; top: 0; border: 0; width: 748px; height: 0" width="748"></iframe>

 

也可以像下图这样直接运行sql语句

运行这个sqlite操作类,电脑需要安装SQLite ODBC 驱动,非精简版系统一般都有安装,这个步骤可以忽略。

 

 

出处:https://www.codenong.com/cs105185005/

======================================================================================

======================================================================================

标签:sqlite,--,数据库,SQLite,js,sql,var,con
From: https://www.cnblogs.com/mq0036/p/17263819.html

相关文章

  • EasyCVR视频融合平台如何通过国标GB28181协议级联至海康云眸平台?
    EasyCVR视频融合平台基于云边端一体化,能实现海量视频资源的轻量化接入、汇聚与管理,平台可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、智能......
  • D. Not Quite Lee
    思路对于偶数,可以采用裴蜀定理确定为是中间的奇数的数量,并且数量是占一半的。所以只需要先确定最小的gcd,然后大的任选,就可以求出这个gcd中不满足条件的数量的个数。采用......
  • AI大数据视频智能预警平台EasyCVR服务遇到加密狗授权失败是什么原因?
    EasyCVR视频融合平台基于云边端一体化架构,具有强大的数据接入、处理及分发能力,平台支持海量视频汇聚管理,能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集......
  • S355J2+N 钢板介绍
    S355J2+N钢板介绍、S355J2+N定扎、S355J2+N按图切割 按图切割 2、S355J2+N在标准EN10025-2标准第4.1.2组别和等级:此标准定义了八种钢材组别S185,S2......
  • 安装 MongoDB
    安装MongoDBhttps://www.mongodb.com/try/download/community如果是Yum安装,可以Package选项选server,然后拷贝链接后使用yum直接安装,如yuminstallhttps://repo.mongo......
  • [USACO08FEB]Hotel G 线段树区间合并|维护最长的连续1
    这个还是看代码,比讲的清楚#include<bits/stdc++.h>#definefastioios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)#definels(rt<<1)#definers(rt<<1|1......
  • 【题解】[HNOI2007]梦幻岛宝珠
    题目分析:对于这种某一个值很大另一个值很小的背包题,就是要求找特殊性质。既然每一个\(w\)都可以写成\(a\times2^b\)的性质,就可以对于每一个\(b\)单独做背包,这样......
  • python一个带参数脚本调用另一个带参数的脚本 问题
    python  a.pymain:args=argget.parse_args(args=[])b.funa() pythonb.pydeffuna():args=argget.parse_args() 当两个py文件都需要arg参数的......
  • 云原生系列
    什么是云原生​云原生CloudNative1在公有云,私有云,混合云,基于容器,服务网格,微服务,不可变的基础设施和声明式API......
  • Java泛型详解
    注:本文转自:https://blog.csdn.net/qq_41701956/article/details/123473592泛型在java中有很重要的地位,无论是开源框架还是JDK源码都能看到它。毫不夸张的说,泛型是通用设......