最近看到一個使用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>