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

node連接mysql查詢(xún)事務(wù)處理的實(shí)現(xiàn)

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

自己用 mysql 很多次的,然后又是主玩nodejs的.專(zhuān)門(mén)寫(xiě)一篇文章來(lái)說(shuō)說(shuō)nodejs連接mysql數(shù)據(jù)庫(kù)。在使用之前,請(qǐng)檢查計(jì)算機(jī)是否具有一下環(huán)境!

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

進(jìn)入正題 mysql 增刪改查

首先,我們?nèi)ハ螺d一個(gè)叫mysql的依賴(lài)包,這個(gè)包就是通過(guò) nodejs 代碼去連接數(shù)據(jù)庫(kù),從而操作數(shù)據(jù)庫(kù)。

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

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

安裝依賴(lài)

D:\nodejs_mysql>npm i mysql -D # 安裝mysql 依賴(lài)包

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

const mysql = require("mysql");

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

function select() {
  // 請(qǐng)求連接mysql
  pool.getConnection((err, connection) => {
    // 未連接成功 報(bào)錯(cuò)
    if (err) throw err;
    // 得到一個(gè) 連接對(duì)象 調(diào)用 query 方法 可以執(zhí)行 sql 語(yǔ)句
    let sql = "select * from goods";
    // 運(yùn)行sql語(yǔ)句 query 第二個(gè)參數(shù)為 sql語(yǔ)句需要的參數(shù) ,沒(méi)有可以不寫(xiě)
    connection.query(sql, (errors, results, fields) => {
      // 釋放連接
      connection.release();
      // 如果運(yùn)行sql語(yǔ)句有報(bào)錯(cuò) 拋出錯(cuò)誤
      if (errors) throw errors;
      console.log(results);
      console.log(fields);
    });
  });
}

select();

以上的代碼是查詢(xún) 數(shù)據(jù)庫(kù)apm一個(gè)數(shù)據(jù)表goods的數(shù)據(jù)。results為從數(shù)據(jù)庫(kù)取出的數(shù)據(jù)。

封裝方法 使用Promise來(lái)查詢(xún)數(shù)據(jù)庫(kù)

//  index.js
// ... 忽略前面的創(chuàng)建mysql連接池代碼
function query(sql, params) {
  return new Promise((resolve, reject) => {
    pool.getConnection((err, connection) => {
      // 未連接成功 報(bào)錯(cuò)
      if (err) return reject(err);
      // 得到一個(gè) 連接對(duì)象 調(diào)用 query 方法 可以執(zhí)行 sql 語(yǔ)句
      // 運(yùn)行sql語(yǔ)句 query 第二個(gè)參數(shù)為 sql語(yǔ)句需要的參數(shù) ,沒(méi)有可以不寫(xiě)
      connection.query(sql, params, (errors, results, fields) => {
        // 釋放連接
        connection.release();
        // 如果運(yùn)行sql語(yǔ)句有報(bào)錯(cuò) 拋出錯(cuò)誤
        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);
  });

這樣就向外暴露了一個(gè)數(shù)據(jù)庫(kù)運(yùn)行 sql 的接口。通過(guò)promise使用.then這種鏈?zhǔn)秸{(diào)用的代碼風(fēng)格。

mysql 事務(wù)處理

說(shuō)到 mysql 事務(wù),我也就不做過(guò)多介紹了,這里給個(gè)友情鏈接方便大家學(xué)習(xí)。MySQL 事務(wù)處理

我們直接步入正題,使用promise來(lái)封裝 mysql 的事務(wù)處理.

// index.js

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

/**
 * mysql 事務(wù)處理
 * @param {Array} sqls 需要執(zhí)行的sql語(yǔ)句
 * @param {Array} params 對(duì)應(yīng)上面sql語(yǔ)句的參數(shù)
 * @returns {Promise} 返回一個(gè)Promise
 */
function transaction(sqls, params) {
  return new Promise((resolve, reject) => {
    pool.getConnection(function (err, connection) {
      // 連接失敗 promise直接返回失敗
      if (err) {
        return reject(err);
      }
      // 如果 語(yǔ)句和參數(shù)數(shù)量不匹配 promise直接返回失敗
      if (sqls.length !== params.length) {
        connection.release(); // 釋放掉
        return reject(new Error("語(yǔ)句與傳值不匹配"));
      }
      // 開(kāi)始執(zhí)行事務(wù)
      connection.beginTransaction((beginErr) => {
        // 創(chuàng)建事務(wù)失敗
        if (beginErr) {
          connection.release();
          return reject(beginErr);
        }
        console.log("開(kāi)始執(zhí)行事務(wù),共執(zhí)行" + sqls.length + "條語(yǔ)句");
        // 返回一個(gè)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 方法 對(duì)里面的每個(gè)promise執(zhí)行的狀態(tài) 檢查
        Promise.all(funcAry)
          .then((arrResult) => {
            // 若每個(gè)sql語(yǔ)句都執(zhí)行成功了 才會(huì)走到這里 在這里需要提交事務(wù),前面的sql執(zhí)行才會(huì)生效
            // 提交事務(wù)
            connection.commit(function (commitErr, info) {
              if (commitErr) {
                // 提交事務(wù)失敗了
                console.log("提交事務(wù)失敗:" + commitErr);
                // 事務(wù)回滾,之前運(yùn)行的sql語(yǔ)句不生效
                connection.rollback(function (err) {
                  if (err) console.log("回滾失?。? + err);
                  connection.release();
                });
                // 返回promise失敗狀態(tài)
                return reject(commitErr);
              }

              connection.release();
              // 事務(wù)成功 返回 每個(gè)sql運(yùn)行的結(jié)果 是個(gè)數(shù)組結(jié)構(gòu)
              resolve(arrResult);
            });
          })
          .catch((error) => {
            // 多條sql語(yǔ)句執(zhí)行中 其中有一條報(bào)錯(cuò) 直接回滾
            connection.rollback(function () {
              console.log("sql運(yùn)行失?。?" + error);
              connection.release();
              reject(error);
            });
          });
      });
    });
  });
}
module.exports = {
  transaction,
};

之后只需要調(diào)用這個(gè)方法就可以執(zhí)行 mysql 事務(wù)了

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

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

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

相關(guān)文章

  • Node接收電子郵件的實(shí)例代碼

    Node接收電子郵件的實(shí)例代碼

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

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

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

    node基于async/await對(duì)mysql進(jìn)行封裝

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

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

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

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

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

    Node.js 使用axios讀寫(xiě)influxDB的方法示例

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

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

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

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

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

    Node.js定時(shí)任務(wù)之node-schedule使用詳解

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

    Node.js如何響應(yīng)Ajax的POST請(qǐng)求并且保存為JSON文件詳解

    這篇文章主要介紹了關(guān)于Node.js是如何響應(yīng)Ajax的POST請(qǐng)求并且保存為JSON文件的相關(guān)資料,文中介紹的很詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-03-03

最新評(píng)論