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


    前言:好久没写博客了,最近一直在忙,没时间梳理。最近遇到一个需求是读取本地SQLite文件,还是花费了点时间才实现,没怎么看到vite方面写这个的文章,现在分享出来完整流程。

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

    pnpm add SQL.js
    
    • 1

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

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

    在vite.config,js中写入:

    ...
       build: {
        	rollupOptions: {
            plugins: [
              // 在这里添加 wasm 插件
              wasm({
                include: /\.wasm$/i // 这里可能需要调整为你的文件路径和名称
              })
            ],
    	}
    }
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    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();
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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);
      }
    };
    
    • 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

    主要是这几句:

     const Uints = new Uint8Array(reader.result);
      db = new SQL.Database(Uints);
      const result = db.exec("SELECT PhotoFile  FROM Photo");
      ...
      reader.readAsArrayBuffer(file);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这是db3数据库的结构:

    在这里插入图片描述
    我取其中的PhotoFile值(.ovr不用看,我自己加的):
    在这里插入图片描述

  • 相关阅读:
    精研科技融入汽车内饰 Laedana打造车内空间新生态
    Jmeter项目实战
    MySQL概览
    Sqlserver存储过程快速上手分享
    业务数字化管理合同的 3 个核心组成部分及其如何降低您的运营成本
    计算机毕业设计 智慧养老中心管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
    Linux 系统上卸载 Docker
    linux高级---k8s中的五种控制器
    MySQL优化(count、分页、join)及数据类型的选择(思维导图)
    为什么要在电影院装监控?有什么作用?
  • 原文地址:https://blog.csdn.net/hzqzzz/article/details/134520527