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

显示如下,说明已成功

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<Object>

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

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

               fields: Array<string>,索引字段                 

              unique:唯一索引,默认false

创建模型实例对象         

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

举例: 

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

 定义模型

(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();
})()

猜你喜欢

转载自blog.csdn.net/weixin_41229588/article/details/106646315