一、作用


类似 git 管理源代码 一样,维护你的 DB。

二、安装


npm install --save sequelize-cli

三、使用


1、构建项目时

node_modules/.bin/sequelize init

会创建以下四个文件夹:

  • config, 包含配置文件,它告诉 CLI 如何连接数据库
  • models,包含您的项目的所有模型
  • migrations, 包含所有迁移文件
  • seeders, 包含所有种子文件

问:如何修改这四个文件的位置?

答:在项目的根目录中创建一个空文件 .sequelizerc

const path = require('path');

module.exports = {
'config': path.resolve('config', 'database.json'),
'models-path': path.resolve('db', 'models'),
'seeders-path': path.resolve('db', 'seeders'),
'migrations-path': path.resolve('db', 'migrations')
}

注1:config 支持引入jsonjs 两种格式( js 更加灵活)

注2:config 还支持连接远程数据库

node_modules/.bin/sequelize db:migrate --url 'mysql://root:password@mysql_host.com/database_name'

2、创建数据库

node_modules/.bin/sequelize db:create xxx

如果数据库已存在,会报错:

ERROR: database "xxx" already exists

3、创建模型(和迁移)

node_modules/.bin/sequelize model:generate --name User --attributes firstName:string,lastName:string,email:string

会发生:

  • models 文件夹中创建了一个 user 模型文件
  • migrations 文件夹中创建了一个名字像 XXXXXXXXXXXXXX-create-user.js 的迁移文件

CLI 这种写法太繁琐了,一般先用 CLI 建立个 base 版,再手动同步修改 modelsmigrations

4、迁移 - 针对表结构

(1)运行所有未执行过的迁移

node_modules/.bin/sequelize db:migrate

会发生:

  • 默认 SequelizeMeta 表中会多若干条迁移记录
  • 创建 Users
(2)撤消最近一个迁移

node_modules/.bin/sequelize db:migrate:undo

会发生:

  • SequelizeMeta 表的记录抹去最近的一条
  • Users 表被删除
(3)撤消所有迁移

node_modules/.bin/sequelize db:migrate:undo:all

(4)撤消到特定的迁移

node_modules/.bin/sequelize db:migrate:undo:all --to XXXXXXXXXXXXXX-create-posts.js

默认会记录迁移的记录在数据库的 SequelizeMeta 表里(可更改,见下文)

5、种子 - 针对表数据

(1)创建种子

node_modules/.bin/sequelize seed:generate --name demo-user

会发生:

  • seeders 文件夹中创建一个种子文件,文件名看起来像是 XXXXXXXXXXXXXX-demo-user.js
(2)运行所有未执行过的种子

node_modules/.bin/sequelize db:seed:all

(3)撤销所有种子

node_modules/.bin/sequelize db:seed:undo:all

默认并不会记录种子的记录(可开启,见下文)

6、迁移 / 种子记录的存储

  • sequelize : 将迁移和种子存储在 sequelize 数据库的表中
  • json : 将迁移和种子存储在 json 文件上
  • none : 不存储任何迁移/种子

写法:

{
"development": {
"username": "root",
"password": null,
"database": "database_development",
"host": "127.0.0.1",
"dialect": "mysql", // ------迁移存储------ // 使用不同的存储类型. Default: sequelize
"migrationStorage": "json",
// 使用不同的文件名. Default: sequelize-meta.json
"migrationStoragePath": "sequelizeMeta.json",
// 使用不同的表名. Default: SequelizeMeta
"migrationStorageTableName": "sequelize_meta" // ------种子存储------ // 使用不同的存储空间. Default: none
"seederStorage": "json",
// 使用不同的文件名. Default: sequelize-data.json
"seederStoragePath": "sequelizeData.json",
// 使用不同的表名 Default: SequelizeData
"seederStorageTableName": "sequelize_data"
}
}

我个人的习惯是迁移种子都是 sequelize

7、迁移框架

一个典型迁移文件的构成:

module.exports = {
up: (queryInterface, Sequelize) => {
// 转变为新状态的逻辑
// 返回一个 `Promise`
}, down: (queryInterface, Sequelize) => {
// 恢复更改的逻辑
// 返回一个 `Promise`
}
}

8、更多 CLI 操作

node_modules/.bin/sequelize help


四、坑


1、已经事先写好了 models,但是需要从 models 生成 migrations 脚本,怎么办?

官方并不支持(见讨论:https://github.com/sequelize/cli/issues/157)

可以用第三方脚本(如:https://gist.github.com/ahelord/a7a7d293695b71aadf04157f0f7dee64)

2、同一个 migrations 脚本中存在两个及以上的枚举类型(ENUM),则执行迁移失败,怎么办?

这也是官方的一个 bug,我们可以除了第一个枚举类型用 queryInterface.createTable,其它的枚举类型请用 queryInterface.sequelize.query 这种接近原生的写法,例如:

queryInterface.sequelize.query("CREATE TYPE \"enum_MemberActionlogs_newColumn\" AS ENUM ('领卡', '激活', '领卷', '核销', '购物');  ALTER TABLE \"MemberActionlogs\" ADD COLUMN \"newColumn\" \"enum_MemberActionlogs_newColumn\";")

3、sequelize.sync() vs migrations

推荐在开发和生产环境里都使用 migrations,sync() 功能太过于单薄。

可参考:Sequelize Sync vs Migrations - Stack Overflow


参考资料:

https://demopark.github.io/sequelize-docs-Zh-CN/migrations.html

Sequelize 学习笔记(11)- Migrations 迁移的更多相关文章

  1. Ext.Net学习笔记11:Ext.Net GridPanel的用法

    Ext.Net学习笔记11:Ext.Net GridPanel的用法 GridPanel是用来显示数据的表格,与ASP.NET中的GridView类似. GridPanel用法 直接看代码: < ...

  2. SQL反模式学习笔记11 限定列的有效值

    目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中.类似于数据字典. 反模式:在列定义上指定可选值 1. 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值 ...

  3. golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好

    golang学习笔记11   golang要用jetbrain的golang这个IDE工具开发才好  jetbrain家的全套ide都很好用,一定要dark背景风格才装B   从File-->s ...

  4. Spring MVC 学习笔记11 —— 后端返回json格式数据

    Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...

  5. Python3+Selenium3+webdriver学习笔记11(cookie处理)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记11(cookie处理)'''from selenium im ...

  6. 并发编程学习笔记(11)----FutureTask的使用及实现

    1. Future的使用 Future模式解决的问题是.在实际的运用场景中,可能某一个任务执行起来非常耗时,如果我们线程一直等着该任务执行完成再去执行其他的代码,就会损耗很大的性能,而Future接口 ...

  7. 《C++ Primer Plus》学习笔记11

    <C++ Primer Plus>学习笔记11 第17章 输入.输出和文件 <<<<<<<<<<<<<< ...

  8. SpringMVC:学习笔记(11)——依赖注入与@Autowired

    SpringMVC:学习笔记(11)——依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...

  9. Spring 源码学习笔记11——Spring事务

    Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...

  10. 汇编学习笔记(11)int指令和端口

    格式 int指令也是一种内中断指令,int指令的格式为int n,n是中断类型码.也就是说,使用int指令可以调用任意的中断例程,例如我们可以显示的调用0号中断例程,还记得在汇编学习笔记(10)中我们 ...

随机推荐

  1. vi怎么统计查找字符串的个数

    vi怎么统计查找字符串的个数 用vi打开一个比较大的文本,用vi查找指定字符串,现在怎么统计该字符串的个数呢?比如我查找ORA字符串,直接输入 /ORA的时候vi会高亮显示.现在怎么统计ORA的个数呢 ...

  2. Spring使用Jackson处理json数据

    1.搭建SpringMVC+Spring环境 2.配置web.xml.SpringMVC-config.xml <?xml version="1.0" encoding=&q ...

  3. PHP错误日志记录:display_errors与log_errors的区别

    我们所做的东西,无论在开发环境还是在生产环境都可能会出现一些问题. 开发环境下,我们会要求错误尽可能详细的呈现出来,错误提示信息越详细越好,越详细越能帮助开发人员确定问题所在并从根本上解决他们. 生产 ...

  4. js数组去除重复数据

    一个有重复数据的数组,准备一个空数组,遍历有重复数据的数组同时用indexOf对比那个空数组判断是否有一样的,不一样的push进去空数组 let arr = dataInfo.map(item =&g ...

  5. [leetcode]31. Next Permutation下一个排列

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  6. Python开发——数据类型【字符串】

    字符串定义 字符串是一个有序的字符的集合,用于存储和表示基本的文本信息 在Python中加了引号的字符,都被认为是字符串! 单引号.双引号.多引号之间的区别? 答案:单双引号没有区别 多引号的作用? ...

  7. mysq

    https://blog.csdn.net/wwd0501/article/details/71171614 47.105.144.1 iptables -I INPUT -p tcp --dport ...

  8. tomact的安装配置

    1.到官网下载tomact安装程序包,http://tomcat.apache.org/ 2.下载core下zip版本 (1)tar.gz文件是Linux操作系统下的安装版本 (2)exe文件是Win ...

  9. Fabric的权限管理:Attribute-Based Access Control

    之前稍微了解过Client Identity Chaincode Library,这几天正好开始实际应用. 虽然了解过,还是发现了不少之前理解的不足,也踩了不少坑. 先列出官方介绍: https:// ...

  10. [翻译]高并发框架 LMAX Disruptor 介绍

    原文地址:Concurrency with LMAX Disruptor – An Introduction 译者序 前些天在并发编程网,看到了关于 Disruptor 的介绍.感觉此框架惊为天人,值 ...