(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.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
}
})
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
})
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' 注释属性之后,右键设计表,即可看到注释:
使用模型作为类:
class User extentds Model {
static classLevelMethod() {}, // 类方法
instanceMethod() {} // 实例方法
}