安裝依賴包
mysql2插件官網:https://github.com/sidorares/node-mysql2
更詳細的文檔需移步mysql插件官網:https://github.com/mysqljs/mysql
npm install mysql2
數據庫配置文件(config/database.js)
// 文件路徑:config/database.js
module.exports = {
// 數據庫類型
'type': 'mysql',
// 服務器地址
'hostname': '127.0.0.1',
// 數據庫名
'database': 'db_test',
// 用戶名
'username': 'root',
// 密碼
'password': '123456',
// 端口
'hostport': '3306',
// 數據庫連接參數
'params': [],
// 數據庫編碼默認采用utf8/utf8mb4
'charset': 'utf8mb4',
}
數據庫連接池文件(utils/db_connection.js)
// 文件路徑:utils/db_connection.js
/**
* 數據庫連接池
*/
const nm_mysql = require('mysql2/promise');
const databaseConfig = require('../config/database.js');
const connPool = nm_mysql.createPool({
user: databaseConfig.username,
password: databaseConfig.password,
host: databaseConfig.hostname,
port: databaseConfig.port,
charset: databaseConfig.charset,
database: databaseConfig.database
})
// 進程退出時自動關閉連接池
process.on('exit', async (code) => {
try {
await connPool.end()
} catch (error) {
}
})
module.exports = {
connPool,
databaseConfig
};
數據庫通用操作文件(utils/db_utils.js)
// 文件路徑:utils/db_utils.js
/**
* 數據庫通用操作文件
*/
const {
connPool,
databaseConfig
} = require('./db_connection.js')
/**
* 返回所有數據表
* @param {String} dbname
* @param {String} tablename
* @return array TABLE_NAME, TABLE_TYPE, ENGINE, DATA_LENGTH, CREATE_TIME, TABLE_COLLATION, TABLE_COMMENT
*/
async function getTables(dbName, tablename = '') {
if (!dbName) {
dbName = databaseConfig.database;
}
let sql = `select TABLE_NAME, TABLE_TYPE, ENGINE, DATA_LENGTH, CREATE_TIME, TABLE_COLLATION, TABLE_COMMENT
from information_schema.tables where TABLE_SCHEMA=? AND TABLE_TYPE='BASE TABLE'`;
const [rows, fields] = await connPool.query(sql, [dbName]);
return rows;
}
/**
* 返回所有列
* @param {String} dbname
* @param {String} tablename
* @param {Boolean} withKeyName
* @return array COLUMN_NAME, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE,
* EXTRA, COLUMN_DEFAULT, COLUMN_TYPE, COLUMN_KEY, COLUMN_COMMENT
*/
async function getFields(dbName, tableName, withKeyName = false) {
if (!dbName) {
dbName = databaseConfig.database;
}
let sql = `select COLUMN_NAME, ORDINAL_POSITION, COLUMN_DEFAULT, COLUMN_TYPE, IS_NULLABLE, EXTRA, DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, COLUMN_KEY, COLUMN_COMMENT from
information_schema.columns WHERE TABLE_SCHEMA=? AND TABLE_NAME=? order by ORDINAL_POSITION`
const [rows, fields] = await connPool.query(sql, [dbName, tableName]);
return rows;
}
module.exports = {
getTables,
getFields,
connPool,
databaseConfig
}
主文件(main.js)
// 文件路徑:main.js
const nm_fs = require('fs');
const nm_path = require('path');
const dbUtils = require('./utils/db_utils.js')
// 普通查詢測試
async function test() {
const rows = await dbUtils.getTables('');
console.log(rows);
}
// 事務測試
async function testTrans() {
// 創建連接
let conn = await dbUtils.connPool.getConnection();
// 開啟事務
await conn.beginTransaction();
try {
const [rows] = await conn.execute('select * from pedm_auth_admin')
if (rows.length > 0) {
const userName = rows[0].user_name;
// 必然正確的命令
await conn.execute('update pedm_auth_admin set updated_at=?,login_count=login_count+1 where user_name=?', [new Date().getTime() / 1000, userName]);
// 必然出錯的命令
// await conn.execute('update pedm_auth_admin set updated_at=?,login_count=login_count+error where user_name=?', [new Date().getTime() / 1000, userName]);
}
// 提交事務
await conn.commit();
console.log('事務成功提交');
} catch (error) {
// 回滾事務
conn.rollback();
console.log('事務回滾', error.sqlMessage, error);
}
// 釋放連接
conn.release();
}
// 執行
// test();
testTrans();
運行
node main.js