Node项目使用Sequelize操作数据库(一)(包括模型,增,删、改等)

Sequelize 是一个基于 Promise 的 Node.js ORM,目前支持 Postgres、MySQL、SQLite 和 Microsoft SQL Server。它具有强大的事务支持,关联关系、读取和复制等功能。

所谓ORM是指对象关系映射,通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式

以下以使用mysql数据库作为案例

为了演示,首先新建文件夹初始化项目

$ mkdir sequelizeTest  // 新建文件夹

$ cd sequelizeTest  // 进入文件夹

$ npm init --yes // 初始化项目

1. 安装

// Using NPM
$ npm install --save sequelize
// 使用哪种数据库选择不同的安装
$ npm install --save mysql2
$ npm install --save pg pg-hstore # Postgres
$ npm install --save mariadb
$ npm install --save sqlite3
$ npm install --save tedious # Microsoft SQL Server

我这里安装mysql2

2.数据库连接测试

在项目文件夹下新建一个index.js

(async function() {
  const Sequelize = require('sequelize');
  // 第一个参数是数据库名,第二个参数是数据库用户名,第三个参数密码
  // 第四个参数配置参数 包括地址,数据库类型等
  const sequelize = new Sequelize('list', 'root', '123456', {
    host: 'localhost',
    dialect: 'mysql'
  });
  // 测试是否连接函数
  sequelize.authenticate()
    .then(() => {
      console.log('连接成功');
      console.log("hello");
    })
    .catch(err => {
      console.log(err);
    })
})()

使用nodemon 作为热更新启动,这样就不用每次重启了

$ npm install nodemon -g

启动项目

$ nodemon index

显示如下,说明已成功

Node项目使用Sequelize操作数据库(一)(包括模型,增,删、改等)_第1张图片

3.定义模型

用来表述(描述)数据库表字段信息的对象,每一个模型对象表示数据库中的一个表,后续对数据库的操作都是通过对应的模型对象来完成的

modelName:模型名称,自定义         

attributes:模型中包含都数据,每一个数据映射对应表中都每一个字段         

options:模型(表)的设置

attributes:字段值描述:

  • type:字段类型,String|DataTypes
  • allowNull:是否允许为空,默认为true
  • defaultValue:默认值,默认为null
  • unique:值唯一,默认为false
  • primaryKey:是否为主键,默认为false

options:模型(表)的设置

  • timestamps:是否给每条记录添加 createdAt 和 updatedAt 字段,并在添加新数据和更新数据的时候自动设置这两个字段的值,默认为true
  • paranoid:设置 deletedAt 字段,当删除一条记录的时候,并不是真的销毁记录,而是通过该字段来标示,即保留数据,进行假删除,默认为false
  • freezeTableName:禁用修改表名; 默认情况下,sequelize将自动将所有传递的模型名称(define的第一个参数)转换为复数。 默认为false             
  • tableName:手动设置表的实际名称
  • 定义表索引    indexes:Array

             每个索引对象可以设置的值               

                   name:索引名称,默认模型名称+字段                 

                   fields: Array,索引字段                 

                  unique:唯一索引,默认false

    创建模型实例对象         

    一个模型类对应一个表,一个模型实例对象就是一条对应的表记录,通过操作这个对象来关联操作对应的表中的数据,操作模型类就是操作表,操作模型类对象就是操作该表中的某条记录         模型类 - 表         模型实例 - 记录

    举例: 

    新建数据库list,新建一个users表 数据结构如下:

    Node项目使用Sequelize操作数据库(一)(包括模型,增,删、改等)_第2张图片

     定义模型

    (async function() {
      const Sequelize = require('sequelize');
      const sequelize = new Sequelize('list', 'root', '123456', {
        host: 'localhost',
        dialect: 'mysql'
      });
      const UsersModel = await sequelize.define('Users', {
        id: {
          allowNull: false,
          autoIncrement: true,
          primaryKey: true,
          type: Sequelize.INTEGER
        },
        username: {
          type: Sequelize.STRING(20),
          allowNull: false
        },
        password: {
          type: Sequelize.CHAR(32),
          allowNull: false
        },
        createdAt: {
          allowNull: false,
          type: Sequelize.DATE
        },
        updatedAt: {
          allowNull: false,
          type: Sequelize.DATE
        }
      }, {
        tableName: 'users'
      });
      // UsersModel
      // let user = UsersModel.build({
      //    username: "swnd",
      //    password: "q11111"
      // });
      // user = await user.save();
      // console.log(user.get({'id': 3}));
    })()

    对于数据类型请参考 Sequelize - DataTypes。

    4. 单表的增删改

    方式一:调用 build 方法后对象只存在于内存中,需要进一步调用 save 方法才会保存到数据库中。

    let user = UsersModel.build({
       username: "swnd",
       password: "q11111"
    });
    user = await user.save();
    console.log(user.get({'id': 3}));

    以上代码运行后,终端将会输出以下信息:

    方式二:调用 create 方法后,会直接保存到数据库中。
    const user = UsersModel.create({
      username: 'zhangsan',
      password: '123456'
    })
    console.log(user.get({'id': 6}));
    

    方案一

    const hasUser = await UsersModel.findOne({
      where: {
        id: 6,
        username: 'zhangsan'
      }
    });
    hasUser.username = 'wanggangdan'
    hasUser.save();
    

    方案二

    const hasUser = await UsersModel.findOne({
      where: {
        id: 6
      }
    });
    const updatedUser = await hasUser.update({
      username: "green"
    });
    hasUser.save();
    

    限制更新某字段

    // 方案一
    const hasUser = await UsersModel.findOne({
      where: {
        id: 6
      }
    });
    const updatedUser = await hasUser.update({
      username: "green2",
      password: '8888888888'
    },{
       fields: ['username']  // 只允许更新这个
    });
    
    
    // 方案二
    const hasUser = await UsersModel.findOne({
      where: {
        id: 6
      }
    });
    hasUser.username = 'wanggangdan'
    hasUser.passwprd = '8989878888'
    hasUser.save({ fields: ['username'] }); // 只允许更新这个

    const hasUser = await UsersModel.findOne({
      where: {
        id: 3
      }
    });
    await hasUser.destroy();

    如果我们启用了 paranoid(偏执)模式,destroy 的时候不会执行 DELETE 语句,而是执行一个 UPDATE 语句将 deletedAt 字段设置为当前时间(一开始此字段值为NULL)。不过需要注意的是,仅当 timestamps=true 为 true 时,paranoid 模式才能生效。

     

    未完待续

    本篇测试代码

    (async function() {
      const Sequelize = require('sequelize');
      const sequelize = new Sequelize('list', 'root', '123456', {
        host: 'localhost',
        dialect: 'mysql'
      });
      const UsersModel = await sequelize.define('Users', {
        id: {
          allowNull: false,
          autoIncrement: true,
          primaryKey: true,
          type: Sequelize.INTEGER
        },
        username: {
          type: Sequelize.STRING(20),
          allowNull: false
        },
        password: {
          type: Sequelize.CHAR(32),
          allowNull: false
        },
        createdAt: {
          allowNull: false,
          type: Sequelize.DATE
        },
        updatedAt: {
          allowNull: false,
          type: Sequelize.DATE
        }
      }, {
        tableName: 'users'
      });
      // 增 
      // 方式一
      // let user = UsersModel.build({
      //    username: "swnd",
      //    password: "q11111"
      // });
      // user = await user.save();
      // console.log(user.get({'id': 3}));
      // 方式二
      // const user = UsersModel.build({
      //   username: 'zhangsan2',
      //   password: '123456'
      // })
      // console.log(user.get({'id': 6}));
      // 改
      const hasUser = await UsersModel.findOne({
        where: {
          id: 3
        }
      });
      // hasUser.username = 'wanggangdan'
      // hasUser.passwprd = '8989878888'
      // hasUser.save({ fields: ['username'] }); // 只允许更新这个
      
      // const updatedUser = await hasUser.update({
      //   username: "green2",
      //   password: '8888888888'
      // },{
      //    fields: ['username']  // 只允许更新这个
      // });
      await hasUser.destroy();
    })()
    

     

    你可能感兴趣的:(Node,Sequelize操作数据库,mysql,数据库)