【mysql】ORM库Sequelize的基础使用

310 阅读3分钟

官网

sequelize.org/master/inde…

简单介绍

Sequelize是基于orm,基于promise的一个mysql库。

orm

即对象关系映射。

简单来说:orm会将对象与数据库建立联系。使用orm库时,不直接运行各种sql语句,而是通过包装好的方法对对象进行操作。

再简单的说:操作数据库,不用在代码里敲各种sql语句,可以安心的当一个高贵的API调用师了。

安装

npm install --save sequelize

同时你还要选择一个驱动安装(下列选一个,本文使用了mysql2)

$ npm install --save pg pg-hstore # Postgres
$ npm install --save mysql2
$ npm install --save mariadb
$ npm install --save sqlite3
$ npm install --save tedious # Microsoft SQL Server

基础逻辑

引入Sequelize 创建实例。连接数据库。

使用Sequelize实例创建Model实例。调用Model实例的各种方法,进行对数据库数据的操作。

基础使用

连接

    const sequelize = new Sequelize({
      database: 'todolist',		
      username: 'root',			
      password: '123456',
      host: 'localhost',
      port: 3306,
      dialect: 'mysql',		//关系型数据库
      pool: {
        max: 5,
        min: 0,
        idle: 30000,
      },
    });

创建实例后会自己动连接,测试连接状态:

sequelize.authenticate().then(()=>{
console.log("成功)
}) .catch(()=>{
 console.log("失败)
  }) 

创建Model

import { DataTypes } from 'sequelize';
// sequelize.define(Model名,{各列的类型},{参数})
const User = sequelize.define(
  'User',							//指定表名
  {
    id: { 
	    type: DataTypes.INTEGER, 	//指定类型
	    autoIncrement: true, 		//自增。
	    primaryKey: true 			//主键
    },
    username: { 
	    type: DataTypes.STRING, 
	    allowNull: false 			//不能为null
    },
    password: { 
	    type: DataTypes.STRING, 
	    allowNull: false 
    },
    avatar: { 
	    type: DataTypes.STRING, 
	    allowNull: true, 
	    defaultValue: '1.png' 
    },
  },
  {
    tableName: 'users',		//设置对应表名
    timestamps: false,		//设置为true时,会自动在数据中增加两项时间戳
  }
);

Datatype

对应数据库的各种类型,以下是常用的几种。其他的在官网都有介绍。

DataTypes.STRING             // VARCHAR(255)
DataTypes.STRING(1234)       // VARCHAR(1234)
DataTypes.BOOLEAN            // TINYINT(1)
DataTypes.INTEGER            // INTEGER

DataTypes.FLOAT              // FLOAT
DataTypes.FLOAT(11)          // FLOAT(11)
DataTypes.FLOAT(11, 10)      // FLOAT(11,10)
DataTypes.DATE       		 // DATETIME 

参数介绍

tableName

sequelize.define的第一个参数为Model的名称。创建Model实例时,会自动根据该名称,对相应的表建立关联(表的名称为Model实例名称的复数形式)。 例如:

Model名称        对应表名
user                   users
pserson			  people

推荐直接通过设置表名(设置 sequelize.define第二个参数中的tableName属性)

数据操作

//可为空的列和id不用设置
User.create({username:'123', password:'123'});

User.destroy({ where: { id:0 } });

User.update({ avatar:'xxx.png'}, { where: { id:0 } });

User.findOne({ where: { id: 0} });
User.findAll({ where: { avatar: '1.png'} });

注意

返回值类型

所有的方法均返回Promise

findOne,create 返回Promise<Model>

findAll 返回Promise<Model[]>

update,destroy 返回Promise<number>

返回值处理

第一种:调用Model实例自带的toJson方法(结果只会包括数据库数据)

let user = await User.findOne({where:{id:0})
console.log(user.toJson)
/*
{
	id:0,
	username:'xxx'
	password:'xxx'
	avatar:'xxx'
}
*/

缺点:返回Model数组时,需要一个个的调用。所以这种方法只适合返回单个Model实例的情况。

第二种 :调用JSON方法(结果同样也只会包括数据库数据)

let users = await User.findAll({where:{avatar:'1.png'})
console.log(JSON.parse(JSON.stringify(users )))
/*
[
{
	id:0,
	username:'xxx'
	password:'xxx'
	avatar:'1.png'
},
{
	id:1,
	username:'xxx'
	password:'xxx'
	avatar:'1.png'
}
]

*

推荐分离出一个工具方法。