Node.js 使用 JavaScript 语法操作数据库的方案

在 Node.js 中,可以通过原生数据库驱动或使用 ORM(对象关系映射)来操作数据库。以下是关于如何在 Node.js 中使用 JavaScript 语法操作数据库的详细整理,包括两种主要方式:直接使用 SQL 和使用 ORM。


1. 使用原生 SQL 语法

1.1 MySQL / MariaDB
  • 安装数据库驱动

    npm install mysql2
  • 操作示例

    const mysql = require('mysql2');
     
    // 创建数据库连接
    const connection = mysql.createConnection({
      host: 'localhost',
      user: 'root',
      password: 'password',
      database: 'my_database'
    });
     
    // 查询数据
    connection.query('SELECT * FROM users WHERE age > ?', [30], (err, results, fields) => {
      if (err) {
        console.error('查询错误:', err);
      } else {
        console.log('查询结果:', results);
      }
      connection.end();  // 关闭连接
    });
1.2 PostgreSQL
  • 安装数据库驱动

    npm install pg
  • 操作示例

    const { Client } = require('pg');
     
    // 创建数据库连接
    const client = new Client({
      user: 'postgres',
      host: 'localhost',
      database: 'my_database',
      password: 'password',
      port: 5432
    });
     
    // 查询数据
    client.connect()
      .then(() => client.query('SELECT * FROM users WHERE age > $1', [30]))
      .then((result) => {
        console.log('查询结果:', result.rows);
      })
      .catch((err) => {
        console.error('查询错误:', err);
      })
      .finally(() => {
        client.end();  // 关闭连接
      });

2. 使用 ORM(对象关系映射)

ORM 可以简化数据库操作,通过 JavaScript 对象进行数据库的 CRUD 操作,而不需要编写 SQL 语句。

2.1 Sequelize (适用于关系型数据库)
  • 安装 Sequelize 和数据库驱动

    npm install sequelize mysql2
  • 操作示例

    const { Sequelize, DataTypes } = require('sequelize');
     
    // 创建 Sequelize 实例
    const sequelize = new Sequelize('mysql://root:password@localhost:3306/my_database');
     
    // 定义模型
    const User = sequelize.define('User', {
      name: {
        type: DataTypes.STRING,
        allowNull: false
      },
      age: {
        type: DataTypes.INTEGER,
        allowNull: false
      }
    });
     
    // 插入数据
    async function createUser() {
      await sequelize.authenticate();  // 确保连接成功
      await User.sync();  // 创建表(如果不存在)
     
      const user = await User.create({
        name: 'John Doe',
        age: 30
      });
     
      console.log('用户创建成功:', user.toJSON());
    }
     
    // 查询数据
    async function getUsers() {
      const users = await User.findAll();  // 查找所有用户
      console.log('所有用户:', users.map(user => user.toJSON()));
    }
     
    // 更新数据
    async function updateUser() {
      const user = await User.findOne({ where: { name: 'John Doe' } });
      if (user) {
        user.age = 31;
        await user.save();  // 保存更新
        console.log('用户更新成功:', user.toJSON());
      }
    }
     
    // 删除数据
    async function deleteUser() {
      const user = await User.findOne({ where: { name: 'John Doe' } });
      if (user) {
        await user.destroy();  // 删除用户
        console.log('用户删除成功');
      }
    }
     
    // 调用示例
    createUser();
    getUsers();
    updateUser();
    deleteUser();

通过 Sequelize,你可以通过 JavaScript 对象来进行数据库操作,ORM 会自动生成 SQL 查询执行。

2.2 Mongoose (适用于 MongoDB)

Mongoose 是 MongoDB 的官方 ORM,允许通过 JavaScript 对象进行 MongoDB 操作,而无需编写 MongoDB 查询语法。

  • 安装 Mongoose

    npm install mongoose
  • 操作示例

    const mongoose = require('mongoose');
     
    // 连接到 MongoDB 数据库
    mongoose.connect('mongodb://localhost:27017/my_database', { useNewUrlParser: true, useUnifiedTopology: true });
     
    // 定义模型
    const userSchema = new mongoose.Schema({
      name: String,
      age: Number
    });
     
    const User = mongoose.model('User', userSchema);
     
    // 插入数据
    async function createUser() {
      const user = new User({
        name: 'Jane Doe',
        age: 28
      });
     
      await user.save();  // 保存到数据库
      console.log('用户创建成功:', user);
    }
     
    // 查询数据
    async function getUsers() {
      const users = await User.find();  // 查找所有用户
      console.log('所有用户:', users);
    }
     
    // 更新数据
    async function updateUser() {
      const user = await User.findOne({ name: 'Jane Doe' });
      if (user) {
        user.age = 29;
        await user.save();  // 保存更新
        console.log('用户更新成功:', user);
      }
    }
     
    // 删除数据
    async function deleteUser() {
      await User.deleteOne({ name: 'Jane Doe' });  // 删除用户
      console.log('用户删除成功');
    }
     
    // 调用示例
    createUser();
    getUsers();
    updateUser();
    deleteUser();

通过 Mongoose,你可以直接使用 JavaScript 对象进行 CRUD 操作,ORM 会自动处理查询构造。

2.3 TypeORM (适用于关系型数据库)

TypeORM 是一个支持 TypeScript 和 JavaScript 的 ORM,支持多种关系型数据库,如 MySQL, PostgreSQL, SQLite 和 SQL Server。

  • 安装 TypeORM 和数据库驱动

    npm install typeorm mysql2
  • 操作示例

    const { createConnection, Entity, PrimaryGeneratedColumn, Column } = require('typeorm');
     
    // 定义模型(实体)
    @Entity()
    class User {
      @PrimaryGeneratedColumn()
      id;
     
      @Column()
      name;
     
      @Column()
      age;
    }
     
    // 创建数据库连接并操作
    async function connectAndOperate() {
      const connection = await createConnection({
        type: 'mysql',
        host: 'localhost',
        port: 3306,
        username: 'root',
        password: 'password',
        database: 'my_database',
        entities: [User],
        synchronize: true,  // 自动同步数据库表结构
      });
     
      // 插入数据
      const userRepository = connection.getRepository(User);
      const user = new User();
      user.name = 'Alice';
      user.age = 25;
      await userRepository.save(user);
     
      // 查询数据
      const users = await userRepository.find();
      console.log('查询结果:', users);
     
      // 关闭连接
      await connection.close();
    }
     
    connectAndOperate();

通过 TypeORM,你可以通过 JavaScript 对象进行数据库操作,ORM 会自动生成 SQL 语句进行执行。


3. 总结

  • 原生 SQL 语法:使用数据库驱动(如 mysql2, pg)直接编写 SQL 查询来操作数据库。适合需要完全控制查询语句的场景。
  • ORM(对象关系映射):通过框架如 Sequelize, MongooseTypeORM,使用 JavaScript 对象进行数据库操作,避免手写 SQL。适合需要简化开发过程和提高代码可维护性的场景。

对于关系型数据库,推荐使用 SequelizeTypeORM;对于 MongoDB,推荐使用 Mongoose。ORM 提供了更高层次的抽象,减少了数据库操作的复杂度,同时提升了开发效率。