欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

node連接mysql查詢事務處理的實現(xiàn)

 更新時間:2021年11月02日 10:35:12   作者:阿政想暴富  
本文主要介紹了node連接mysql查詢事務處理的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

自己用 mysql 很多次的,然后又是主玩nodejs的.專門寫一篇文章來說說nodejs連接mysql數(shù)據庫。在使用之前,請檢查計算機是否具有一下環(huán)境!

  • nodejs 執(zhí)行環(huán)境。
  • mysql數(shù)據庫環(huán)境(下載地址)。
  • navicat 連接 mysql 數(shù)據庫的圖形化操作軟件。(非必要)

進入正題 mysql 增刪改查

首先,我們去下載一個叫mysql的依賴包,這個包就是通過 nodejs 代碼去連接數(shù)據庫,從而操作數(shù)據庫。

創(chuàng)建一個文件夾,快速生成pakeage.json文件

D:\nodejs_mysql>npm init -y  # 快速傳創(chuàng)建包管理文件

安裝依賴

D:\nodejs_mysql>npm i mysql -D # 安裝mysql 依賴包

創(chuàng)建一個 index.js 文件,代碼如下

const mysql = require("mysql");

// 創(chuàng)建 一個mysql 連接池
const pool = mysql.createPool({
  host: "127.0.0.1", // 連接數(shù)據庫的地址 127.0.0.1 為本地的mysql
  user: "root", //  連接數(shù)據庫的用戶名 root 是最高權限
  password: "", //  連接數(shù)據庫的密碼
  database: "apm", // 操作的數(shù)據庫名
  port: "3306", // 連接mysql的端口號
  multipleStatements: true, // 運行一次執(zhí)行多條sql語句 可以忽略此項
});

function select() {
  // 請求連接mysql
  pool.getConnection((err, connection) => {
    // 未連接成功 報錯
    if (err) throw err;
    // 得到一個 連接對象 調用 query 方法 可以執(zhí)行 sql 語句
    let sql = "select * from goods";
    // 運行sql語句 query 第二個參數(shù)為 sql語句需要的參數(shù) ,沒有可以不寫
    connection.query(sql, (errors, results, fields) => {
      // 釋放連接
      connection.release();
      // 如果運行sql語句有報錯 拋出錯誤
      if (errors) throw errors;
      console.log(results);
      console.log(fields);
    });
  });
}

select();

以上的代碼是查詢 數(shù)據庫apm一個數(shù)據表goods的數(shù)據。results為從數(shù)據庫取出的數(shù)據。

封裝方法 使用Promise來查詢數(shù)據庫

//  index.js
// ... 忽略前面的創(chuàng)建mysql連接池代碼
function query(sql, params) {
  return new Promise((resolve, reject) => {
    pool.getConnection((err, connection) => {
      // 未連接成功 報錯
      if (err) return reject(err);
      // 得到一個 連接對象 調用 query 方法 可以執(zhí)行 sql 語句
      // 運行sql語句 query 第二個參數(shù)為 sql語句需要的參數(shù) ,沒有可以不寫
      connection.query(sql, params, (errors, results, fields) => {
        // 釋放連接
        connection.release();
        // 如果運行sql語句有報錯 拋出錯誤
        if (errors) return reject(errors);
        resolve(results);
      });
    });
  });
}

query("select * from goods", null).then((result) => {
  console.log(result);
});
module.exports = {
  query,
};

使用

// data.js
const index = require("./index.js");
var sql = "select * from goods";
index
  .query(sql, null)
  .then((result) => {
    // do anything ....
  })
  .catch((err) => {
    // error
    console.log(err);
  });

這樣就向外暴露了一個數(shù)據庫運行 sql 的接口。通過promise使用.then這種鏈式調用的代碼風格。

mysql 事務處理

說到 mysql 事務,我也就不做過多介紹了,這里給個友情鏈接方便大家學習。MySQL 事務處理

我們直接步入正題,使用promise來封裝 mysql 的事務處理.

// index.js

// .... 部分創(chuàng)建 pool 的代碼

/**
 * mysql 事務處理
 * @param {Array} sqls 需要執(zhí)行的sql語句
 * @param {Array} params 對應上面sql語句的參數(shù)
 * @returns {Promise} 返回一個Promise
 */
function transaction(sqls, params) {
  return new Promise((resolve, reject) => {
    pool.getConnection(function (err, connection) {
      // 連接失敗 promise直接返回失敗
      if (err) {
        return reject(err);
      }
      // 如果 語句和參數(shù)數(shù)量不匹配 promise直接返回失敗
      if (sqls.length !== params.length) {
        connection.release(); // 釋放掉
        return reject(new Error("語句與傳值不匹配"));
      }
      // 開始執(zhí)行事務
      connection.beginTransaction((beginErr) => {
        // 創(chuàng)建事務失敗
        if (beginErr) {
          connection.release();
          return reject(beginErr);
        }
        console.log("開始執(zhí)行事務,共執(zhí)行" + sqls.length + "條語句");
        // 返回一個promise 數(shù)組
        let funcAry = sqls.map((sql, index) => {
          return new Promise((sqlResolve, sqlReject) => {
            const data = params[index];
            connection.query(sql, data, (sqlErr, result) => {
              if (sqlErr) {
                return sqlResolve(sqlErr);
              }
              sqlReject(result);
            });
          });
        });
        // 使用all 方法 對里面的每個promise執(zhí)行的狀態(tài) 檢查
        Promise.all(funcAry)
          .then((arrResult) => {
            // 若每個sql語句都執(zhí)行成功了 才會走到這里 在這里需要提交事務,前面的sql執(zhí)行才會生效
            // 提交事務
            connection.commit(function (commitErr, info) {
              if (commitErr) {
                // 提交事務失敗了
                console.log("提交事務失敗:" + commitErr);
                // 事務回滾,之前運行的sql語句不生效
                connection.rollback(function (err) {
                  if (err) console.log("回滾失?。? + err);
                  connection.release();
                });
                // 返回promise失敗狀態(tài)
                return reject(commitErr);
              }

              connection.release();
              // 事務成功 返回 每個sql運行的結果 是個數(shù)組結構
              resolve(arrResult);
            });
          })
          .catch((error) => {
            // 多條sql語句執(zhí)行中 其中有一條報錯 直接回滾
            connection.rollback(function () {
              console.log("sql運行失敗: " + error);
              connection.release();
              reject(error);
            });
          });
      });
    });
  });
}
module.exports = {
  transaction,
};

之后只需要調用這個方法就可以執(zhí)行 mysql 事務了

// data.js
const index = require("./index.js");
var sqls = [
  "delete from goods where goods_id = ?", // 刪除 語句
  "update goods set num = ? where goods_id = ?;", // 更新語句
];
var params = [
  [1], // parmas 是數(shù)組格式 與sqls里的sql語句里 ? 一一對應
  [5, 3],
];

index
  .transaction(sqls, params)
  .then((arrResult) => {
    // do anything ....
  })
  .catch((err) => {
    // error
    console.log(err);
  });

到此這篇關于node連接mysql查詢事務處理的實現(xiàn)的文章就介紹到這了,更多相關node連接mysql查詢事務處理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Node接收電子郵件的實例代碼

    Node接收電子郵件的實例代碼

    本篇文章主要介紹了Node接收電子郵件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • node.js文件的復制、創(chuàng)建文件夾等相關操作

    node.js文件的復制、創(chuàng)建文件夾等相關操作

    這篇文章主要給大家介紹了node.js文件的復制、創(chuàng)建文件夾等相關操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • node基于async/await對mysql進行封裝

    node基于async/await對mysql進行封裝

    這篇文章主要介紹了node基于async/await對mysql進行封裝,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,,需要的朋友可以參考下
    2019-06-06
  • Node.JS中的模塊、exports和module講解

    Node.JS中的模塊、exports和module講解

    這篇文章主要介紹了Node.JS中的模塊、exports和module講解,模塊分為兩類一類是核心模塊一類是文件模塊,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • node.js在Linux下執(zhí)行shell命令、.sh腳本的問題

    node.js在Linux下執(zhí)行shell命令、.sh腳本的問題

    很多時候需要多個命令來完成一項工作,而這個工作又常常是重復的,這個時候我們自然會想到將這些命令寫成sh腳本,下次執(zhí)行下這個腳本一切就都搞定了,下面就是發(fā)布代碼的一個腳本示例
    2022-01-01
  • Node.js 使用axios讀寫influxDB的方法示例

    Node.js 使用axios讀寫influxDB的方法示例

    這篇文章主要介紹了Node.js 使用axios讀寫influxDB的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • Linux CentOS系統(tǒng)下安裝node.js與express的方法

    Linux CentOS系統(tǒng)下安裝node.js與express的方法

    這篇文章主要給大家介紹了在Linux CentOS系統(tǒng)下安裝node.js與express的方法,文中介紹的非常詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-04-04
  • node.js中fs文件系統(tǒng)目錄操作與文件信息操作

    node.js中fs文件系統(tǒng)目錄操作與文件信息操作

    本篇文章給大家詳細分析了node.js中fs文件系統(tǒng)目錄操作與文件信息操作的方法以及代碼詳解,需要的讀者可以參考下。
    2018-02-02
  • Node.js定時任務之node-schedule使用詳解

    Node.js定時任務之node-schedule使用詳解

    這篇文章主要介紹了Node.js定時任務之node-schedule使用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Node.js如何響應Ajax的POST請求并且保存為JSON文件詳解

    Node.js如何響應Ajax的POST請求并且保存為JSON文件詳解

    這篇文章主要介紹了關于Node.js是如何響應Ajax的POST請求并且保存為JSON文件的相關資料,文中介紹的很詳細,對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-03-03

最新評論