Sequelize 基本用法

223 阅读3分钟

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 字段将包含最新更新的时间戳.

  1. 可以使用 timestamps: false 禁用此行为


export default seq.define(

'students',

{

// ...属性定义

},

{ timestamps: false },

);

  1. 只启用 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