Back

electron - electron-vue 使用sqlite3的基本例子 sqlite db run exec 的各种操作

发布时间: 2021-04-12 03:09:00

如题。参考:https://stackoverflow.com/questions/17954743/node-js-and-express-passing-sqlite-data-to-one-of-my-views

API:  https://github.com/mapbox/node-sqlite3/wiki/API#databaseallsql-param--callback

<template>
  <div id="wrapper">
    {{sql_result}}
    <ul>
      <li v-for='item in items' :key='item.id'>{{item.info}}</li>
    </ul>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        sql_result: 'asdf',
        items: []
      }
    },
    computed: {
    }, 
    components: {
    },
    methods: {
    },
    mounted() {
      var sqlite3 = require('sqlite3').verbose();
      var db = new sqlite3.Database(':memory:');
      let that = this;

      db.serialize(function() {
        db.run("CREATE TABLE lorem (info TEXT)");

        var stmt = db.prepare("INSERT INTO lorem VALUES (?)");
        for (var i = 0; i < 10; i++) {
            stmt.run("Ipsum " + i);
        }
        stmt.finalize();

        db.each("SELECT rowid AS id, info FROM lorem", function(err, row) {
            console.log(row.id + ": " + row.info);
            that.items.push(row)
            that.sql_result += row.info + ","
        }, function(err, row_numbers){
            console.info('in call backs');

            console.info('err: ' + err);
            console.info('row_nubmers: ' + row_numbers)
            this.items = row_numbers
            console.info("sql_result: " + this.sql_result);
        });
      });

      db.close();
      console.info('done')
    }
  }
</script>

再看一段代码: 例子2

下面的代码中,删掉数据库的值之后,等300ms,再刷新当前页面

1. 代码是顺序执行的 ( in serialize 0 .. 1... 2... )

2. init() 是一个独立的方法, 在mounted 中调用

3. sleep, db_tool 都是放在了  render/main.js 中。

      to_delete(id) {
        console.info("-=--- in delete")

        let db = this.$database_tool.get_db()
        let that = this
        console.info("=== in serialize 0")
        db.serialize(function(){
          db.run('delete from categories where id = ?', id)
          that.$message.success("操作成功")
          console.info("=== in serialize 1")
        })
        console.info("=== in serialize 2")
        db.close();
        that.$sleep(300).then( () => {
          that.init();
        })
      }

render/main.js: 

// 引入 this.$database_tool
import {database_tool} from '@/lib/database_tool.js'
Vue.prototype.$database_tool = database_tool

const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs));
Vue.prototype.$sleep = sleep

lib/database_tool.js

var sqlite3 = require('sqlite3').verbose();
const DB_NAME = 'database.sqlite3'


let database_tool = {
  get_db: function(){
    return new sqlite3.Database(DB_NAME);
  },

  check_or_setup_database: function (){
    console.info("== in check_or_setup_database")
    var db = this.get_db()
    let that = this
    //  可以把这里改成true
    let is_init_data = false

    db.close()
  },

  close_db: function(){
    this.get_db().close()
  }

}

export {database_tool}

更新:2种传参方法  

      // As an array.
      db.run("UPDATE tbl SET name = ? WHERE id = ?", [ "bar", 2 ]);

      // As an object with named parameters.
      db.run("UPDATE tbl SET name = $name WHERE id = $id", {
          $id: 2,
          $name: "bar"
      });

更新3: serialize 中的查询 是顺序执行的(待商榷!)

      write_single_row_for_csv(row){
        let that = this
        let db = that.$database_tool.get_db()

        db.serialize(function(){

          let industry_id = 0
          db.get(`select * from industries where name = "${row['industry_name']}"`, [], function(error, row){
            industry_id = row.id
          })

          let material_id = 0
          db.get(`select * from materials where name = "${row['material_name']}"`, [], function(error, row){
            material_id = row.id
          })

          let sql = `
            insert into emission_ratios(name, material_id, industry_id, algorithm_id, value,
              english_name, product_name,
              created_at, updated_at)
            values("${row['name']}", ${material_id}, ${industry_id}, ${row['algorithm_id']}, ${row['value']},
              "${row['english_name']}", "${row['product_name']}",
              datetime('now'), datetime('now') )
          `
          console.info(sql)

          db.run(sql)
        })
        db.close();
      },

Back