注册
node.js连接数据库
专栏/技术分享/ 文章详情 /

node.js连接数据库

DM_738629 2026/10/23 55 0 0
摘要

环境准备

Node.js 的版本至少为 v12.0.0

安装 dmdb 包

创建项目文件夹,再项目文件下打开命令窗口
npm install dmdb

image20260907140315662.png

使用示例

数据库连接

创建连接示例文件,内容如下:
执行代码:node dmtest.js

const db = require("dmdb"); //包含dmdb包路径


// 修改IP、端口、账号密码
const connStr = "dm://SYSDBA:DMdata456@192.168.43.3:5234?autoCommit=false&schema=SYSDBA";

(async function () {
  let conn;
  try {
    conn = await db.getConnection(connStr);
    const res = await conn.execute("SELECT 1 AS NUM FROM DUAL", [], {
      outFormat: db.OUT_FORMAT_OBJECT
    });
    console.log("连接成功,结果:", res.rows);
  } catch (e) {
    console.error("连接失败:", e);
  } finally {
    if (conn) await conn.close();
  }
})();

相关说明:
 const res = await conn.execute("SELECT 1 AS NUM FROM DUAL", [], {
      outFormat: db.OUT_FORMAT_OBJECT
    });
`conn.execute(sql, bindParams, options)` 执行 SQL
`[]`:绑定参数数组,这条 SQL 没有占位参数,填空数组。
outFormat: db.OUT_FORMAT_OBJECT:返回行是 JS 对象 `{ NUM:1 }`,列名作为 key

image20260907143045947.png

数据库增删改查

插入查询数据

const db = require("dmdb");

// ========== 1、开启驱动调试日志(全局方式) ==========
db.LOG_LEVEL = 4;   // 打开DEBUG日志,驱动会控制台输出底层交互

// 连接串也可以指定 logLevel,优先级高于全局属性
// logLevel=4 开启调试日志
const connStr = "dm://SYSDBA:DMdata456@192.168.43.3:5234?autoCommit=false&schema=SYSDBA&logLevel=4";


(async function () {
    let conn;
    try {
        // 获取独立连接
        conn = await db.getConnection(connStr);
        console.log("数据库连接建立完成");

        // ---------------------- 新增 INSERT ----------------------
        const insertSql = `INSERT INTO TEST_USER(ID,USER_NAME,AGE) VALUES(:1,:2,:3)`;
        // 插入第1行
        await conn.execute(insertSql, [{val:1},{val:"张三"},{val:22}]);
        // 插入第2行
        await conn.execute(insertSql, [{val:2},{val:"李四"},{val:24}]);
        // 插入第3行
        await conn.execute(insertSql, [{val:3},{val:"王五"},{val:21}]);
        console.log("执行插入完成");

        // ---------------------- 查询 SELECT ----------------------

		const selectAllSql = `SELECT ID,USER_NAME,AGE FROM TEST_USER`;
		const queryAllRes = await conn.execute(selectAllSql, [], {
			outFormat: db.OUT_FORMAT_OBJECT
		});
		console.log("查询全部数据:", queryAllRes.rows);

		// 事务提交 autoCommit=false,必须手动commit
        await conn.commit();
        console.log("事务提交成功");

    } catch (e) {
        console.error("执行异常:", e);
        // 异常回滚
        if (conn) {
            await conn.rollback();
            console.log("已执行事务回滚");
        }
    } finally {
        if (conn) {
            await conn.close();
            console.log("连接已关闭释放");
        }
    }
})();

image20260907145554166.png

修改删除数据

const db = require("dmdb");

// ========== 1、开启驱动调试日志(全局方式) ==========
db.LOG_LEVEL = 4;   // 打开DEBUG日志,驱动会控制台输出底层交互

// 连接串也可以指定 logLevel,优先级高于全局属性
// logLevel=4 开启调试日志
const connStr = "dm://SYSDBA:DMdata456@192.168.43.3:5234?autoCommit=false&schema=SYSDBA&logLevel=4";


(async function () {
    let conn;
    try {
        // 获取独立连接
        conn = await db.getConnection(connStr);
        console.log("数据库连接建立完成");

     // ---------------------- 修改 UPDATE ----------------------
        const updateSql = `UPDATE TEST_USER SET AGE=:age WHERE ID=:id`;
        await conn.execute(updateSql, [
            { val: 23 },
            { val: 1 }
        ]);
        console.log("执行更新完成");

        // ---------------------- 删除 DELETE ----------------------
        const deleteSql = `DELETE FROM TEST_USER WHERE ID=:id`;
        await conn.execute(deleteSql, [{ val: 3 }]);
        console.log("执行删除完成");
        
 	 // ---------------------- 查询 SELECT ----------------------

		const selectAllSql = `SELECT ID,USER_NAME,AGE FROM TEST_USER`;
		const queryAllRes = await conn.execute(selectAllSql, [], {
			outFormat: db.OUT_FORMAT_OBJECT
		});
		console.log("查询全部数据:", queryAllRes.rows);
       
		// 事务提交 autoCommit=false,必须手动commit
        await conn.commit();
        console.log("事务提交成功");

    } catch (e) {
        console.error("执行异常:", e);
        // 异常回滚
        if (conn) {
            await conn.rollback();
            console.log("已执行事务回滚");
        }
    } finally {
        if (conn) {
            await conn.close();
            console.log("连接已关闭释放");
        }
    }
})();




image20260907145913607.png

连接池使用

const db = require("dmdb");

db.LOG_LEVEL = 3;
const connectString = "dm://SYSDBA:DMdata456@192.168.43.3:5234?autoCommit=false&schema=SYSDBA";

let pool = null;

async function initPool() {
  pool = await db.createPool({
    connectString: connectString,
    poolAlias: "multi_session_pool",
    poolMax: 5,    //池子最大5个会话
    poolMin: 2,    //初始化就创建2个空闲会话
    poolTimeout: 60,
    testOnBorrow: true,
    validationQuery: "SELECT 1 FROM DUAL"
  });
  console.log("连接池初始化完成,poolMin=2,初始2个空闲会话");
}

(async function () {
  await initPool();

  // ========== 取出两个完全独立的会话 connA、connB ==========
  let connA = null;
  let connB = null;
  try {
    // 从池中获取2个不同会话
    connA = await pool.getConnection();
    connB = await pool.getConnection();
    console.log("获取会话A、会话B");

    // --------会话A:插入一条数据,不commit --------
    const insertSql = `INSERT INTO TEST_USER(ID,USER_NAME,AGE) VALUES(:1,:2,:3)`;
    await connA.execute(insertSql, [{ val: 10 }, { val: "A" }, { val: 30 }]);
    console.log("会话A执行插入,尚未commit");

    // 会话A自己查询:可以查到这条未提交数据(会话内可见)
    const resA = await connA.execute("SELECT * FROM TEST_USER WHERE ID=10", [], { outFormat: db.OUT_FORMAT_OBJECT });
    console.log("会话A查询ID=10:", resA.rows);

    // --------会话B查询同一条ID=10,看不到未提交数据(隔离性) --------
    const resB = await connB.execute("SELECT * FROM TEST_USER WHERE ID=10", [], { outFormat: db.OUT_FORMAT_OBJECT });
    console.log("会话B查询ID=10(A未提交):", resB.rows);

    // --------会话A提交事务 --------
    await connA.commit();
    console.log("会话A执行commit提交");

    // --------提交后,会话B可以读到数据 --------
    const resB2 = await connB.execute("SELECT * FROM TEST_USER WHERE ID=10", [], { outFormat: db.OUT_FORMAT_OBJECT });
    console.log("会话B查询ID=10(A已提交):", resB2.rows);

  } catch (e) {
    console.error("异常:", e);
    if (connA) await connA.rollback();
    if (connB) await connB.rollback();
  } finally {
    // 归还两个会话到池子,不是销毁
    if (connA) await connA.close();
    if (connB) await connB.close();
    console.log("会话A、B归还连接池");

    // 关闭整个池子
    await pool.close();
    console.log("整个连接池销毁");
  }
})();

image20260907152637347.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服