Node.js 数据库操作详解:构建高效的数据持久化层

Node.js 数据库操作详解:构建高效的数据持久化层

目录

  • 🔍 MongoDB
    • 📌 使用 mongoose 连接 MongoDB
    • 📌 定义模型和数据验证
    • 📌 实现 CRUD 操作
  • 🛠️ MySQL
    • 📌 使用 mysqlmysql2 模块连接 MySQL
    • 📌 执行 SQL 查询
    • 📌 处理结果和错误
  • 📊 SQLite
    • 📌 使用 sqlite3 模块连接 SQLite
    • 📌 执行 SQL 查询
    • 📌 处理事务

🔍 MongoDB

📌 使用 mongoose 连接 MongoDB

mongoose 是一个为 MongoDB 提供对象数据模型(ODM)的库,通过它可以方便地管理数据结构。通过 mongoose.connect() 函数,可以将 Node.js 程序与 MongoDB 数据库相连。为了保证连接的稳定性,还可以添加一些选项,如 useNewUrlParseruseUnifiedTopology,确保与 MongoDB 的兼容性和安全性。

代码示例:
javascript 复制代码
// 引入 mongoose 模块
const mongoose = require('mongoose');

// 连接到 MongoDB 数据库
mongoose.connect('mongodb://localhost:27017/my_database', {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

// 获取连接对象
const db = mongoose.connection;

// 处理连接错误
db.on('error', console.error.bind(console, '连接错误:'));

// 成功连接时触发
db.once('open', function() {
  console.log('成功连接到 MongoDB 数据库');
});

上面的代码通过 mongoose.connect 函数连接到 MongoDB 数据库,连接成功后会输出相关的提示信息,并且处理了连接过程中可能出现的错误。

📌 定义模型和数据验证

在 MongoDB 中,数据是无模式的,而通过 mongoose 可以定义数据模型,并提供数据验证机制,以确保输入的数据符合指定的规则。Schema 是 mongoose 用来定义数据结构的方式,它可以精确定义每个字段的类型、默认值以及验证规则。

代码示例:
javascript 复制代码
// 定义用户数据模型
const userSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true, // 必须字段
    minlength: 3,   // 最小长度验证
  },
  age: {
    type: Number,
    min: 18,        // 最小值验证
    max: 60         // 最大值验证
  },
  email: {
    type: String,
    required: true,
    match: /.+\@.+\..+/ // 正则表达式验证邮箱格式
  }
});

// 创建模型
const User = mongoose.model('User', userSchema);

在这段代码中,userSchema 定义了一个用户模型,并为 name 字段设置了最小长度为 3 的验证规则,为 age 字段设置了 18 至 60 的取值范围。此外,email 字段还使用正则表达式确保邮箱格式的合法性。

📌 实现 CRUD 操作

CRUD 操作(创建、读取、更新、删除)是数据库应用中最基本的操作。通过 mongoose 提供的模型方法,可以轻松地实现对 MongoDB 数据的增删改查操作。

代码示例:
javascript 复制代码
// 创建新用户
const newUser = new User({ name: 'Alice', age: 25, email: '[email protected]' });
newUser.save(function (err, user) {
  if (err) return console.error(err);
  console.log('新用户已保存:', user);
});

// 读取用户数据
User.find({ age: { $gte: 18 } }, function (err, users) {
  if (err) return console.error(err);
  console.log('符合条件的用户:', users);
});

// 更新用户数据
User.updateOne({ name: 'Alice' }, { age: 26 }, function (err, res) {
  if (err) return console.error(err);
  console.log('用户数据已更新:', res);
});

// 删除用户
User.deleteOne({ name: 'Alice' }, function (err) {
  if (err) return console.error(err);
  console.log('用户已删除');
});

以上代码演示了创建一个新用户、根据条件查询用户、更新用户年龄以及删除用户的基本操作。


🛠️ MySQL

📌 使用 mysqlmysql2 模块连接 MySQL

在 Node.js 中,可以通过 mysqlmysql2 模块来实现对 MySQL 数据库的连接和操作。这两个模块都支持基本的 SQL 查询以及连接池功能。

代码示例:
javascript 复制代码
// 引入 mysql2 模块
const mysql = require('mysql2');

// 创建数据库连接
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'my_database'
});

// 连接到 MySQL 数据库
connection.connect(err => {
  if (err) {
    return console.error('连接失败:', err.message);
  }
  console.log('成功连接到 MySQL 数据库');
});

以上代码使用 mysql2 模块连接到本地的 MySQL 数据库,并处理连接过程中可能出现的错误。

📌 执行 SQL 查询

通过 mysql 模块,可以执行各种 SQL 语句,常见的包括 SELECTINSERTUPDATEDELETE。可以直接调用 query() 方法来执行 SQL 语句,并处理查询结果。

代码示例:
javascript 复制代码
// 执行 SELECT 查询
connection.query('SELECT * FROM users', function (err, results, fields) {
  if (err) {
    console.error('查询失败:', err.message);
    return;
  }
  console.log('查询结果:', results);
});

// 执行 INSERT 操作
const newUser = { name: 'Bob', age: 30, email: '[email protected]' };
connection.query('INSERT INTO users SET ?', newUser, function (err, results) {
  if (err) {
    console.error('插入失败:', err.message);
    return;
  }
  console.log('新用户已插入:', results.insertId);
});

该示例展示了如何执行 SELECTINSERT 操作,以及处理查询返回的数据和插入操作的结果。

📌 处理结果和错误

在 MySQL 操作中,通常需要处理返回的结果和错误信息。例如,在执行 SQL 查询时,返回的 err 对象会包含查询中的错误信息,而结果对象则包含执行操作的结果。

代码示例:
javascript 复制代码
connection.query('SELECT * FROM users WHERE age > 20', function (err, results) {
  if (err) {
    console.error('查询失败:', err.message); // 错误处理
  } else {
    console.log('查询结果:', results); // 输出查询结果
  }
});

通过适当的错误处理机制,可以确保在出现问题时能够正确捕获并记录错误信息。


📊 SQLite

📌 使用 sqlite3 模块连接 SQLite

SQLite 是一种轻量级的嵌入式数据库,适用于小型应用程序。sqlite3 模块可以用于连接和操作 SQLite 数据库。由于 SQLite 是文件数据库,不需要额外的数据库服务支持,非常适合快速开发和测试。

代码示例:
javascript 复制代码
// 引入 sqlite3 模块
const sqlite3 = require('sqlite3').verbose();

// 打开 SQLite 数据库
let db = new sqlite3.Database('./my_database.db', sqlite3.OPEN_READWRITE, (err) => {
  if (err) {
    console.error('数据库连接失败:', err.message);
  } else {
    console.log('成功连接到 SQLite 数据库');
  }
});

以上代码使用 sqlite3 模块连接到一个名为 my_database.db 的 SQLite 数据库,如果文件不存在,可以根据需要自动创建。

📌 执行 SQL 查询

SQLite 支持标准的 SQL 语句,包括查询和修改数据。sqlite3 模块通过 run() 方法执行不返回数据的查询(如 INSERTUPDATEDELETE),并通过 all() 方法执行查询数据的语句(如 SELECT)。

代码示例:
javascript 复制代码
// 插入新数据
db.run(`INSERT INTO users(name, age, email) VALUES(?, ?, ?)`, ['Charlie', 35, '[email protected]'], function(err) {
  if (err) {
    return console.error('插入数据失败:', err.message);
  }
  console.log('新用户已插入,用户ID:', this.lastID);
});

// 查询数据
db.all(`SELECT * FROM users WHERE age > ?`, [20], (err, rows) => {
  if (err) {
    return console.error('查询失败:', err.message);
  }
  console.log('查询结果:', rows);
});

此段代码展示了如何在 SQLite 数据库中插入数据并查询符合条件的记录。

📌 处理事务

SQLite 支持事务

,可以通过 BEGIN TRANSACTIONCOMMITROLLBACK 实现事务的开始、提交和回滚操作。

代码示例:
javascript 复制代码
db.serialize(() => {
  db.run('BEGIN TRANSACTION');

  db.run(`INSERT INTO users(name, age, email) VALUES(?, ?, ?)`, ['Dave', 40, '[email protected]']);

  db.run('COMMIT', function(err) {
    if (err) {
      console.error('提交失败:', err.message);
    } else {
      console.log('事务已提交');
    }
  });
});

通过事务,可以确保一系列操作要么全部执行成功,要么全部回滚,保证数据一致性。

相关推荐
学软件的小铃铛13 分钟前
ELK日志管理框架介绍
elk·系统架构
极简网络科技18 分钟前
Docker、Wsl 打包迁移环境
运维·docker·容器
黑客老李22 分钟前
JavaSec | SpringAOP 链学习分析
java·运维·服务器·开发语言·学习·apache·memcached
杨浦老苏23 分钟前
轻量级Docker管理工具Docker Switchboard
运维·docker·群晖
江湖有缘26 分钟前
【Docker管理工具】部署Docker可视化管理面板Dpanel
运维·docker·容器
難釋懷31 分钟前
Vue解决开发环境 Ajax 跨域问题
前端·vue.js·ajax
特立独行的猫a36 分钟前
Nuxt.js 中的路由配置详解
开发语言·前端·javascript·路由·nuxt·nuxtjs
咸虾米39 分钟前
在uniCloud云对象中定义dbJQL的便捷方法
前端·javascript
梨子同志40 分钟前
JavaScript Proxy 和 Reflect
前端·javascript
汤圆炒橘子43 分钟前
状态策略模式的优势分析
前端