sequelize是一个orm框架,什么是orm呢?即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了。
sequelize目前支持 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server等数据库。
安装
Sequelize 的使用可以通过 npm
npm i Sequelize
在安装了sequelize模块之后,还需要所选数据库安装驱动程序。
创建sequelize实例
要连接到数据库,必须创建一个 Sequelize 实例. 这可以通过将连接参数分别传递到 Sequelize 构造函数来完成:
const { Sequelize } = require('sequelize');
// 分别传递参数 (sqlite数据库)
const sequelize = new Sequelize({
dialect: 'sqlite',
storage: 'path/to/database.sqlite'
});
// 分别传递参数 (其它数据库)
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: /* 选择 'mysql' | 'mariadb' | 'postgres' | 'mssql' 其一 */
,logging: console.log,
});
在导入sequelize模块的时候,require 中的参数是表示 sequelize 模块,在导入sequelize模块之后,返回的是一个对象,通过{}
结构对象,而 { Sequelize }
则表示将对象中的 Sequelize 结构出来,Sequelize 是不可改变的。
以上两种方法都是用来sequelize实例,他们的区别是:第一种方式是创建sqlite数据库的实例,另外一种是创建除了sqlite数据库之外的实例。
在创建过程中,Sequelize 的构造函数中不止上述那些参数,上述参数只是必须参数。
创建模型
在创建完 Sequelize 实例之后,我们需要对表进行创建。而模型是什么呢?模型是 Sequelize 的本质. 模型是代表数据库中表的抽象。
模型的创建有两种方式,一种是通过调用define()
方法,还有一种是init()
方法。接下来我们去了解一下这两种创建方式
使用sequelize.define
这种方式的具体语法格式是:sequelize.define(modelName, attributes, options)
。这种方法需要三个参数,分别表示模型名称、定义列、模型的配置项。其中后两项是比较重要的参数,也是另外一种方式的参数。
modelName
,表示模型的名称,如果没有给模型定义表名,则将使用模型名代替表名,且表名默认复数化。如果不想让表名复数化,可以使用 freezeTableName
配置模型,具体见下关于 option
的内容。也可以使用 tableName
设置主动设置表名,具体见下关于 option
的内容
attributes
,表示对表中字段的定义,它是一个对象。定义字段的属性有很多,接下来我们通过建立一个模型了解一下:
const { DataTypes } = require('sequelize');
const Test = sequelize.define('tesst', {
//type表示列的类型,DataTypes是sequelize模块中自带的属性,表示数据类型
//allowNull表示这个列是否能为空,false表示不能为空,默认值为true
//defaultValue表示列的默认值
firstName: {
type: DataTypes.STRING,
allowNull: false,
defaultValue: "这个是默认值"
},
//unique可以是布尔值或字符串。如果为布尔值则表示这个列是唯一键
//如果是compositeIndex表示为
lastName: {
type: DataTypes.STRING,
allowNull: true,
unique: true
},
//primaryKey表示是否为主键,值为true时表示为主键
third: {
type: DataTypes.INTEGER,
primaryKey: true
},
//field:不使用对象名作为列名,而使用field的属性值
//comment:这个是列的注释
fourth: {
type: DataTypes.INTEGER,
field: "four_th",
comment: '这是带有注释的列'
},
});
options
,用于对模型的配置。常用的配置项:
- reezeTableName :为true时,且当模型名就是表名时,表名不复数化
- tableName: 设置表名
- timestamps: 在默认情况下,创建模型时会自动给模型添加 createdAt 和 updatedAt 字段,分别表示创建表的时间戳、修改表的时间戳。默认值为true。
- createdAt:默认为true,如果值为字符串则表示使用createdAt,且给模型添加的是字符串的值
- updatedAt:同上
在创建模型时,在模型同步时会自动给表添加一个 id 字段,且字段被设为自增长。
在模型创建完成之后,可以通过sequelize实例访问模型,如:sequelize.models.Test
。也可以通过Test
访问模型。
在定义列时,我们使用 DataTypes
给字段添加数据类型,那么我们列举一些常用的数据类型:
字符串类型
DataTypes.STRING // VARCHAR(255)
DataTypes.STRING(1234) // VARCHAR(1234)
DataTypes.STRING.BINARY // VARCHAR BINARY
DataTypes.TEXT // TEXT
DataTypes.TEXT('tiny') // TINYTEXT
DataTypes.CITEXT // CITEXT 仅 PostgreSQL 和 SQLite.
布尔值和数字类型
DataTypes.BOOLEAN // TINYINT(1)
DataTypes.INTEGER // INTEGER
DataTypes.BIGINT // BIGINT
DataTypes.BIGINT(11) // BIGINT(11)
DataTypes.FLOAT // FLOAT
DataTypes.FLOAT(11) // FLOAT(11)
DataTypes.FLOAT(11, 10) // FLOAT(11,10)
DataTypes.REAL // REAL 仅 PostgreSQL.
DataTypes.REAL(11) // REAL(11) 仅 PostgreSQL.
DataTypes.REAL(11, 12) // REAL(11,12) 仅 PostgreSQL.
DataTypes.DOUBLE // DOUBLE
DataTypes.DOUBLE(11) // DOUBLE(11)
DataTypes.DOUBLE(11, 10) // DOUBLE(11,10)
DataTypes.DECIMAL // DECIMAL
DataTypes.DECIMAL(10, 2) // DECIMAL(10,2)
日期
DataTypes.DATE // DATETIME 适用于 mysql / sqlite, 带时区的TIMESTAMP 适用于 postgres
DataTypes.DATE(6) // DATETIME(6) 适用于 mysql 5.6.4+. 支持6位精度的小数秒
DataTypes.DATEONLY // 不带时间的 DATE
使用init()
这种方式是通过扩展Model来新建模型的,这种方式和第一种方式基本一样,除了模型名的定义和其他的一点小差别之外。使用方法将下列详情:
const { DataTypes, Model } = require('sequelize');
class Test2 extends Model {}
Test2.init({
//列的定义
}, {
// 这是其他模型参数
sequelize, // 我们需要传递连接实例
modelName: 'Test2' // 我们需要选择模型名称
});
模型同步
模型在创建完成之后,必须进行同步操作,用于与数据库中表进行对应。有三个同步的方式:
- User.sync() - 如果表不存在,则创建该表(如果已经存在,则不执行任何操作)
- User.sync({ force: true }) - 将创建表,如果表已经存在,则将其首先删除
- User.sync({ alter: true }) - 这将检查数据库中表的当前状态(它具有哪些列,它们的数据类型等),然后在表中进行必要的更改以使其与模型匹配。
在进行模型同步时,可以同步单个模型,也可以一次将所有模型同步。它们的区别是调用sync()
方法的对象不同,一个是单个的模型,一个是sequelize实例
删除表
在