Sequelize 是一个基于 promise 的 Node.js ORM, 目前支持 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server. 它具有强大的事务支持, 关联关系, 预读和延迟加载,读取复制等功能。 Sequelize 遵从 语义版本控制。 支持 Node v10 及更高版本以便使用 ES6 功能。
下面以使用 mysql 为例进行基础说明
基础使用方法
所需依赖
npm i sequelize mysql2 # 必须
npm i koa koa-router nodemon # 非必需
Sequelize 基础方法封装
// 例如此文件路径为:src/utils/db.js
import Sequelize from 'sequelize';
// 数据库配置
const config = {
database: 'zc_study', // 使用哪个数据库
username: 'root', // 用户名
password: '123456', // 口令
host: 'localhost', // 主机名
port: 3306, // 端口号,MySQL默认3306
};
const { database, username, password, host, port } = config;
const sequelize = new Sequelize(database, username, password, {
host,
port,
dialect: 'mysql',
operatorAliases: false,
pool: {
max: 5,
min: 0,
idle: 30000,
},
//解决中文输入问题
define: {
timestamps: false,
charset: 'utf8',
dialectOptions: {
collate: 'utf8_general_ci',
},
},
});
// 测试连接是否成功, authenticate 该方法用于测试链接是否链接数据库成功
sequelize
.authenticate()
.then(() => {
console.log('连接创建成功');
sequelize.sync({
alter: true, // alter:为true时更新表字段
force: false, // force:为true时强制删除表
});
})
.catch(err => {
console.log('连接数据库失败', err);
});
export default sequelize;
定义基础 model
/*
引入封住的方法,目的:
1. 链接数据库(引入时,如果没有链接数据库,则会自动链接,如果已经链接了,那么则不会重复链接数据库)
2. 使用Sequelize 定义模型
*/
// 例如此文件路径为:src/modal/StudentModal.js
import seq from './src/utils/db.js'; // 引入封住的方法
import { DataTypes, Sequelize } from 'sequelize';
export default seq.define(
'students',
{
id: {
type: DataTypes.UUID,
allowNull: false,
primaryKey: true,
defaultValue: Sequelize.UUIDV4,
comment: 'uuid',
},
name: {
type: DataTypes.STRING,
defaultValue: '',
allowNull: false,
comment: '用户姓名',
},
age: {
type: DataTypes.INTEGER,
defaultValue: 10,
allowNull: false,
comment: '用户年龄',
},
hobby: {
type: DataTypes.STRING,
defaultValue: '',
comment: '用户爱好',
},
},
{ freezeTableName: true },
);
默认情况在,定义的表名为单数,创建表时会自动复数化,比如定义表名为 student ,实际创建出来的表名是: students, 如果不想自定变成复数,我们可以借助参数 freezeTableName, 比如: freezeTableName: true 可以停止 Sequelize 执行自动复数化。
引入已经定义的模型
在业务组件中引入定义的 modal 模型,既可以对数据库进行增删改查了。
// 文件路径:src/controller/StudentController.js
import StudentModal from '../modal/StudentModal.js';
export default class StudentController {
constructor() {}
// 数据库插入一条数据
static create(data, options) {
StudentModal.create(data, options);
}
}
知识总结
时间戳
默认情况下,Sequelize 使用数据类型 DataTypes.DATE 自动向每个模型添加 createdAt 和 updatedAt 字段. 这些字段会自动进行管理 - 每当你使用 Sequelize 创建或更新内容时,这些字段都会被自动设置. createdAt 字段将包含代表创建时刻的时间戳,而 updatedAt 字段将包含最新更新的时间戳.
-
可以使用
timestamps: false禁用此行为
export default seq.define(
'students',
{
// ...属性定义
},
{ timestamps: false },
);
-
只启用 createdAt/updatedAt 之一
export default seq.define(
'students',
{
// ...属性定义
},
{
// 不要忘记启用时间戳!
timestamps: true,
// 不想要 createdAt
createdAt: false,
// 想要 updatedAt 但是希望名称叫做 updateTimestamp
updatedAt: 'updateTimestamp',
},
);
数据类型
import {DataTypes} from 'sequelize'
// 字符串
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.TSVECTOR // TSVECTOR 仅 PostgreSQL.
// 布尔
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)
// 无符号和零填充整数 - 仅限于MySQL/MariaDB
DataTypes.INTEGER.UNSIGNED
DataTypes.INTEGER.ZEROFILL
DataTypes.INTEGER.UNSIGNED.ZEROFILL
// 你还可以指定大小,即INTEGER(10)而不是简单的INTEGER
// 同样适用于 BIGINT, FLOAT 和 DOUBLE
// 日期
DataTypes.DATE // DATETIME 适用于 mysql / sqlite, 带时区的TIMESTAMP 适用于 postgres
DataTypes.DATE(6) // DATETIME(6) 适用于 mysql 5.6.4+. 支持6位精度的小数秒
DataTypes.DATEONLY // 不带时间的 DATE
// UUID
DataTypes.UUID
// 通常defaultValue 可以设置成:DataTypes.UUIDV4 或 DataTypes.UUIDV1