(ps:第一次写这篇文章的时候,大概是在前年吧,期间工作原因,文章没写完,那个时候最新版本还是v5,没想到现在已经v6了!以下是结合官方文档v6的版本,记录下Sequelize的用法,仅作为个人笔记使用)

安装:

1、安装sequelize

npm i --save sequelize

2、以mysql数据库为例,需要安装mysql驱动 mysql2

(补充:对于Node.js程序,访问MySQL也是通过网络发送SQL命令给MySQL服务器。这个访问MySQL服务器的软件包通常称为MySQL驱动程序。)

npm i --save mysql2

 

创建链接:

一、链接到数据库时,必须要创建一个Sequelize实例,两种方式:

1、通过参数传递方式传递给Sequelize构造函函数:

2、也可以通过一个URL参数形式传递给Sequelize构造函函数:

const c = {
dbname: xxx // 数据库名字
user: xxx // 数据库用户名
password: xxx // 数据库密码
}
// 方法一:
const Sequelize = require("sequelize")
const sequelize = new Sequelize(c.dbname, c.user, c.password, {
dialect: 'mysql' // 数据库类型
host: 'localhost' // 链接的主机域名
port: '端口号'
})
// 方法二:
const sequelize = new Sequelize('mysql://user:password@localhost:3306/dbname')

二、Sequelize构造函数参数:

Sequelize构造函数参数有:

new Sequelize ( 数据库:​​字符串​​​,用户名:​​字符串​​​,密码:​​字符串​​​,选项:​​对象​​)

数据库: 数据库名字,

用户名: 用户名用于对数据库进行身份验证,

密码:密码用于对数据库进行身份验证,

选项:一个对象options,里边属性如下:

options.host - 主机

options.port - 端口

options.dialect - 链接什么类型的数据库

··· ··· 还有好多,以后在项目中用到,会慢慢补充上来!

 

链接测试:

可以使用 .authenticate( )  测试链接:

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

 

关闭链接:

Sequelize默认情况下,会保持连接,如果需要关闭,可使用:

sequelize.close() // 异步方法,返回的是一个Promise对象

 

定义模型:

一个模型就是一个类,这个模型代表数据库中的表。

Sequelize还定义了默认字段 id(主键),以及 createdAt - 创建时间,updateAt - 更新时间。

两种方式:

(1) sequelize.define(modelName, attributes, options),会返回模型类。

(2) 扩展Model 并掉用 init(attributes, options) ,其中扩展Model就是创建一个类并继承Model类即可!

下边是定义模型的两种方式:

const {Sequelize, DataTypes, Model} = require('sequelize')
const sequelize = new Sequelize('koa_test', 'root', 'xxx', {
dialect: 'mysql',
logging: true,
host: 'localhost',
port: 3306
})
// 创建模型
// 方式一:继承Model类,在调用init方法
class User extends Model{}
User.init({
firstName: {
type: DataTypes.STRING,
allowNull: false
},
lastName: {
type: DataTypes.STRING,
allowNull: false
}
}, {
sequelize, // sequelize 是上边创建链接数据库时,返回的实例
tableName: 'myUser' // 自定义数据库表的名字
})

// 方式二
const User = sequelize.define('myUser', {
firstName: {
type: DataTypes.STRING,
allowNull: false
}
})

Sequelize创建数据库-安装、模型基础配置_数据库

在内部,​​sequelize.define​​​ 调用 ​​Model.init​​,因此两种方法本质上是等效的。

 

访问模型:

以上两种方式定义的模型,都可以使用 实例.models.模型名 来访问到定义的模型:

sequelize.models.User
sequelize.models.myUser

 

关于表名和模型名:

1、表名:

注意:以下两种方式都未明确给出数据库中表的名称,但是Sequelize会自动将模型名复数并将其作用于表名。 这种复数是通过称为 ​​inflection​​​ 的库在后台完成的,因此可以正确计算不规则的复数(例如 ​​person -> people​​)。

const {Sequelize, DataTypes, Model} = require('sequelize')
const sequelize = new Sequelize('koa_test', 'root', 'xxx', { ··· ···})
// 方式1:
class User extends Model{}
User.init({
firstName: DataTypes.STRING,
}, {
sequelize, // sequelize 是上边创建链接数据库时,返回的实例
modelName: 'myUser' // 自定义模型的名字
})
// 方式2:参数一是自定义模型的名字
const User = sequelize.define('myUser', {
firstName: {
type: DataTypes.STRING,
allowNull: false
}
})

Sequelize创建数据库-安装、模型基础配置_mysql_02

2、模型名:

还是以上边2种方式定义的模型为例,

方式1的模型名可以在第二个 options 配置项中使用 modelName 来自定义;

User.init({}, {
modelName: 'modelName'
})

方式2的模型名称可以在第一个参数中自定义。

sequelize.define('modeleName', {})

3、如果你想模型名和数据库中表名一样的话,可以使用:

freezeTableName: true  参数,停止Sequelize指定自动复数化这样,  Sequelize 将推断表名称等于模型名称,而无需进行任何修改:

sequelize.define('modeleName', {
// 属性定义
}, {
freezeTableName: true
})

4、freezeTableName: true

当然,你也可以在创建sequelize实例的时候全局定义此行为,这样,所有的表将会使用与模型名称相同的名称。

const sequelize = new Sequelize('koa_test', 'root', 'xxx', {
dialect: 'mysql',
host: 'localhost',
port: 3306,
define: {
freezeTableName: true
}
})

5、你也可以直接告诉Sequelize表名称:

sequelize.define('User', {
// ... (属性)
}, {
tableName: 'MyUser'
});

 

时间戳:

默认情况下,Sequelize 使用数据类型 ​​DataTypes.DATE​​​ 自动向每个模型添加 ​​createdAt​​​ 和 ​​updatedAt​​​ 字段. 这些字段会自动进行管理 - 每当你使用Sequelize 创建或更新内容时,这些字段都会被自动设置. ​​createdAt​​​ 字段将包含代表创建时刻的时间戳,而 ​​updatedAt​​ 字段将包含最新更新的时间戳。

1、timestamps: false  参数可以禁止此行为

class User extends Model{}
User.init({}, {
sequelize,
timestamps: false
})

Sequelize创建数据库-安装、模型基础配置_数据库_03

2、也可以自定义createAt、updateAt,或禁止某个属性。

class Foo extends Model {}
Foo.init({ /* 属性 */ }, {
sequelize,
// 不要忘记启用时间戳!
timestamps: true,
// 不想要 createdAt
createdAt: false,
// 想要 updatedAt 但是希望名称叫做 updateTimestamp
updatedAt: 'updateTimestamp'
});

 

默认值:

默认情况下,Sequelize 列的默认值为null,我们可用通过 defaultValue 来自定义一个默认值:

User.init({
name: {
type: DataTypes.STRING,
defaultValue: 'default-value',
// defaultValue: Sequelize.NOW 也可以定义特殊值
// 这样,当前日期、时间将用于填充此列(在插入时)
}
}, {
sequelize
})

 

列参数:

在定义列时,除了指定type,还有很多可选参数,如下:

const { Model, DataTypes, Deferrable } = require("sequelize");
class Foo extends Model {}
Foo.init({
// 实例化将自动将 flag 设置为 true (如果未设置)
flag: { type: DataTypes.BOOLEAN, allowNull: false, defaultValue: true },

// 日期的默认值 => 当前时间
myDate: { type: DataTypes.DATE, defaultValue: DataTypes.NOW },

// 将 allowNull 设置为 false 将为该列添加 NOT NULL,
// 这意味着如果该列为 null,则在执行查询时将从数据库引发错误.
// 如果要在查询数据库之前检查值是否不为 null,请查看下面的验证部分.
title: { type: DataTypes.STRING, allowNull: false },

// unique 属性是创建唯一约束的简写.
someUnique: { type: DataTypes.STRING, unique: true },

// 继续阅读有关主键的更多信息
identifier: { type: DataTypes.STRING, primaryKey: true },

// autoIncrement 可用于创建 auto_incrementing 自增的整数列
incrementMe: { type: DataTypes.INTEGER, autoIncrement: true },

// 可以创建外键:
bar_id: {
type: DataTypes.INTEGER,

references: {
// 这是对另一个模型的参考
model: Bar,

// 这是引用模型的列名
key: 'id',

// 使用 PostgreSQL,可以通过 Deferrable 类型声明何时检查外键约束.
deferrable: Deferrable.INITIALLY_IMMEDIATE
// 参数:
// - `Deferrable.INITIALLY_IMMEDIATE` - 立即检查外键约束
// - `Deferrable.INITIALLY_DEFERRED` - 将所有外键约束检查推迟到事务结束
// - `Deferrable.NOT` - 完全不推迟检查(默认) - 这将不允许你动态更改事务中的规则
}
},

// 注释只能添加到 MySQL,MariaDB,PostgreSQL 和 MSSQL 的列中
firstName: {
type: DataTypes.STRING,
comment: '这是一段注释',
allowNull: false
}
})

下边是添加 comment: 'xxx' 注释属性之后,右键设计表,即可看到注释:

Sequelize创建数据库-安装、模型基础配置_自定义_04

 

使用模型作为类:

class User extentds Model {
static classLevelMethod() {}, // 类方法
instanceMethod() {} // 实例方法
}