electron 踩坑之旅(五) —— node + oracledb

1,452 阅读2分钟

使用 electron 可以进行本地数据库连接

1. 下载

首先进行插件下载

npm i oracledb

如果是 32 程序需要下载对应编译二进制版本

npm install https://github.com/oracle/node-oracledb/releases/download/v5.3.0/oracledb-src-5.3.0.tgz

或者

"oracledb": "github:oracle/node-oracledb#v5.3.0"

2. 使用前置条件

安装后是不能直接使用的, 一般需要进行 oracle 客户端安装, 也可以直接从 Oracle 官网下载免费的 64 位 Instant Client Basic ZIP 文件。如果您的 Node.js 架构是 32 位的,那么请改用 32 位 Instant Client

将 ZIP 文件解压缩到应用程序可访问的目录中。例如解压 instantclient-basic-windows.x64-19.11.0.0.0dbru.zip到 C:\oracle\instantclient_19_11.

有几种方法可以告诉 node-oracledb 您的 Oracle 客户端库在哪里,请参阅Initializing Node-oracledb

const oracledb = require('oracledb');
try {
 oracledb.initOracleClient({libDir: 'C:\oracle\instantclient_19_11'});
} catch (err) {
 console.error('Whoops!');
 console.error(err);
 process.exit(1);
}
    1. Oracle Instant Client 库复制到 二进制node_modules/oracledb/build/Release文件所在的目录,打包后会将该文件放入 resources/app.asar.unpacked 文件夹下
    1. 将 Oracle Instant Client 目录添加到PATH 环境变量中。该目录必须出现在PATH任何其他 Oracle 目录之前

当然选用第二种将 oracled 程序打包至应用程序中会比较方便, 但是同时会增加应用程序的体积, 这个就需要进行一个取舍

3. 使用前封装

class DbOracle {
  constructor(dbConfig) {
    this.dbConfig = dbConfig
  }
  async getConnection() {
    return await oracle.getConnection(this.dbConfig)
  }
  async query(sql) {
    const connection = await this.getConnection()
    // 执行sql
    const result = await connection.execute(sql)
    // 释放连接
    connection.release()
    return result
  }
  // 事务执行
  async beginTransaction(sqlArr) {
    const connection = await this.getConnection()
    try {
      const promiseArr = this.getSqlPromise(sqlArr, async(sql, res, req) => {
        try {
          const data = await connection.execute(sql)
          res(data)
        } catch (e) {
          req(e)
        }
      })
      const data = await Promise.all(promiseArr)
      await connection.commit()
      await connection.release()
      return data
    } catch (e) {
      await connection.rollback()
      await connection.release()
      return e
    }
  }
}

4. 使用

详细使用可以参考官方API

4.1 初始化

const db = new DbOracle({
  user: 'hr',
  password: '123456',
  connectString: 'localhost/orclpdb1',
  externalAuth: false
})

4.2 获取连接池

const connection = db.getConnection()

4.3 执行 SQL

db.query('SELECT * FROM no_example').then(data => {
  console.log(data)
})

4.4 多 SQL 事务执行

db.beginTransaction(['SELECT * FROM no_example']).then(data => {
  console.log(data)
})

# 代码地址