官网
https://sequelize.org/master/index.html
简单介绍
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'
}
]
*
推荐分离出一个工具方法。