自己用 mysql 很多次的,然后又是主玩nodejs的.專門寫一篇文章來說說nodejs
連接mysql
數據庫。在使用之前,請檢查計算機是否具有一下環境!
進入正題 mysql 增刪改查
首先,我們去下載一個叫mysql的依賴包,這個包就是通過 nodejs 代碼去連接數據庫,從而操作數據庫。
- 創建一個文件夾,快速生成
pakeage.json
文件
D:\nodejs_mysql>npm init -y # 快速傳創建包管理文件
- 安裝依賴
D:\nodejs_mysql>npm i mysql -D # 安裝mysql 依賴包
- 創建一個
index.js
文件,代碼如下
const mysql = require("mysql");
// 創建 一個mysql 連接池
const pool = mysql.createPool({
host: "127.0.0.1", // 連接數據庫的地址 127.0.0.1 為本地的mysql
user: "root", // 連接數據庫的用戶名 root 是最高權限
password: "", // 連接數據庫的密碼
database: "apm", // 操作的數據庫名
port: "3306", // 連接mysql的端口號
multipleStatements: true, // 運行一次執行多條sql語句 可以忽略此項
});
function select() {
// 請求連接mysql
pool.getConnection((err, connection) => {
// 未連接成功 報錯
if (err) throw err;
// 得到一個 連接對象 調用 query 方法 可以執行 sql 語句
let sql = "select * from goods";
// 運行sql語句 query 第二個參數為 sql語句需要的參數 ,沒有可以不寫
connection.query(sql, (errors, results, fields) => {
// 釋放連接
connection.release();
// 如果運行sql語句有報錯 拋出錯誤
if (errors) throw errors;
console.log(results);
console.log(fields);
});
});
}
select();
以上的代碼是查詢 數據庫apm
一個數據表goods
的數據。results
為從數據庫取出的數據。
- 封裝方法 使用
Promise
來查詢數據庫
// index.js
// ... 忽略前面的創建mysql連接池代碼
function query(sql, params) {
return new Promise((resolve, reject) => {
pool.getConnection((err, connection) => {
// 未連接成功 報錯
if (err) return reject(err);
// 得到一個 連接對象 調用 query 方法 可以執行 sql 語句
// 運行sql語句 query 第二個參數為 sql語句需要的參數 ,沒有可以不寫
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);
});
這樣就向外暴露了一個數據庫運行 sql 的接口。通過promise
使用.then
這種鏈式調用的代碼風格。
mysql 事務處理
說到 mysql 事務,我也就不做過多介紹了,這里給個友情鏈接方便大家學習。MySQL 事務處理
我們直接步入正題,使用
promise
來封裝 mysql 的事務處理
.
// index.js
// .... 部分創建 pool 的代碼
/**
* mysql 事務處理
* @param {Array} sqls 需要執行的sql語句
* @param {Array} params 對應上面sql語句的參數
* @returns {Promise} 返回一個Promise
*/
function transaction(sqls, params) {
return new Promise((resolve, reject) => {
pool.getConnection(function (err, connection) {
// 連接失敗 promise直接返回失敗
if (err) {
return reject(err);
}
// 如果 語句和參數數量不匹配 promise直接返回失敗
if (sqls.length !== params.length) {
connection.release(); // 釋放掉
return reject(new Error("語句與傳值不匹配"));
}
// 開始執行事務
connection.beginTransaction((beginErr) => {
// 創建事務失敗
if (beginErr) {
connection.release();
return reject(beginErr);
}
console.log("開始執行事務,共執行" + sqls.length + "條語句");
// 返回一個promise 數組
let funcAry = sqls.map((sql, index) => {
return new Promise((sqlResolve, sqlReject) => {
const data = params[index];
connection.query(sql, data, (sqlErr, result) => {
if (sqlErr) {
return sqlReject(sqlErr);
}
sqlResolve(result);
});
});
});
// 使用all 方法 對里面的每個promise執行的狀態 檢查
Promise.all(funcAry)
.then((arrResult) => {
// 若每個sql語句都執行成功了 才會走到這里 在這里需要提交事務,前面的sql執行才會生效
// 提交事務
connection.commit(function (commitErr, info) {
if (commitErr) {
// 提交事務失敗了
console.log("提交事務失敗:" + commitErr);
// 事務回滾,之前運行的sql語句不生效
connection.rollback(function (err) {
if (err) console.log("回滾失敗:" + err);
connection.release();
});
// 返回promise失敗狀態
return reject(commitErr);
}
connection.release();
// 事務成功 返回 每個sql運行的結果 是個數組結構
resolve(arrResult);
});
})
.catch((error) => {
// 多條sql語句執行中 其中有一條報錯 直接回滾
connection.rollback(function () {
console.log("sql運行失敗: " + error);
connection.release();
reject(error);
});
});
});
});
});
}
module.exports = {
transaction,
};
- 之后只需要調用這個方法就可以執行 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 是數組格式 與sqls里的sql語句里 ? 一一對應
[5, 3],
];
index
.transaction(sqls, params)
.then((arrResult) => {
// do anything ....
})
.catch((err) => {
// error
console.log(err);
});
以上就是對nodejs操作mysql數據庫的方法,經驗總結。