当前位置: 代码网 > it编程>编程语言>Javascript > vue3+vite+SQL.js如何读取db3文件数据

vue3+vite+SQL.js如何读取db3文件数据

2024年06月11日 Javascript 我要评论
vue3+vite+sql.js读取db3文件数据最近遇到一个需求是读取本地sqlite文件,还是花费了点时间才实现,没怎么看到vite方面写这个的文章,现在分享出来完整流程。tips:解决了打包后w

vue3+vite+sql.js读取db3文件数据

最近遇到一个需求是读取本地sqlite文件,还是花费了点时间才实现,没怎么看到vite方面写这个的文章,现在分享出来完整流程。

tips:解决了打包后wasm文件404问题,在后续

1.pnpm下载sql.js(什么都可以下)

pnpm add sql.js

2.【重点】如果你执行wasm文件时报错404,请执行:

pnpm add --save-dev @rollup/plugin-wasm

在vite.config,js中写入:

...
   build: {
    	rollupoptions: {
        plugins: [
          // 在这里添加 wasm 插件
          wasm({
            include: /\.wasm$/i // 这里可能需要调整为你的文件路径和名称
          })
        ],
	}
}
...

3.在使用的页面中,你需要引入了,但是我在使用setup语法糖写法时候报错,因为执行顺序的问题,这里有两种解决办法;

第一种:不使用语法糖,使用setup()形式;

第二种:使用语法糖,结合onmounted,nexttick解决,以下:

import { onmounted, nexttick, ref } from "vue";
import initsqljs from "sql.js";
const databasecontent = ref(null);
let sql, db;
onmounted(async (nexttick) => {
  sql = await initsqljs({
    locatefile: (file) => `/node_modules/sql.js/dist/${file}`
  });
  db = new sql.database();
});

4.添加选择文件控件,选择.db3文件,触发onfilechange 方法

 <input type="file" @change="onfilechange" />
    <div>
      <ul>
        <li v-for="(item, index) in databasecontent" :key="index">
          {{ item }}
        </li>
      </ul>
    </div>

const onfilechange = (event) => {
  const fileinput = event.target;
  const file = fileinput.files[0];

  if (file) {
    const reader = new filereader();
    reader.onload = () => {
      const uints = new uint8array(reader.result);
      db = new sql.database(uints);
      const result = db.exec("select photofile  from photo");
      if (result && result.length) {
        let table = result[0].values.flat().map((str) => {
          let newrow = str.replace(".\\", "");
          let newovrrow = newrow + ".ovr";
          return [newrow, newovrrow];
        });
        databasecontent.value = table.flat();
      }
    };
    reader.readasarraybuffer(file);
  }
};

主要是这几句:

 const uints = new uint8array(reader.result);
  db = new sql.database(uints);
  const result = db.exec("select photofile  from photo");
  ...
  reader.readasarraybuffer(file);

这是db3数据库的结构:

我取其中的photofile值(.ovr不用看,我自己加的):

以上的操作在vue打包后再运行会报错

因为wasm文件没有被打包进去,经过排查,主要是sql-wasm.wasm这个文件

1.将该文件复制出来,放在public下,我的路径是public-vender-sql-wasm.wasm

2.import引入该文件

import sqlwasm from "/vender/sql-wasm.wasm";
onmounted(async (nexttick) => {
  sql = await initsqljs({
    locatefile: (file) => sqlwasm
  });
});

3.此时依旧会报错,需修改vite.config.js配置

添加

assetsinclude: ["**/*.wasm"]
publicdir: "public",
publicpath: "./",
base: "/", //   hash模式 ./ 历史模式 /

总结

完美解决!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com