Sequelize 学习笔记(11)- Migrations 迁移
一、作用
类似 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支持引入json或js两种格式( 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 版,再手动同步修改
models和migrations。
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`
}
}
Sequelize对象存储可用的数据类型queryInterface对象可以用来修改数据库(api:http://docs.sequelizejs.com/class/lib/query-interface.js~QueryInterface.html#instance-method-removeIndex)
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 迁移的更多相关文章
- Ext.Net学习笔记11:Ext.Net GridPanel的用法
Ext.Net学习笔记11:Ext.Net GridPanel的用法 GridPanel是用来显示数据的表格,与ASP.NET中的GridView类似. GridPanel用法 直接看代码: < ...
- SQL反模式学习笔记11 限定列的有效值
目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中.类似于数据字典. 反模式:在列定义上指定可选值 1. 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值 ...
- golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好
golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好 jetbrain家的全套ide都很好用,一定要dark背景风格才装B 从File-->s ...
- Spring MVC 学习笔记11 —— 后端返回json格式数据
Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...
- Python3+Selenium3+webdriver学习笔记11(cookie处理)
#!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记11(cookie处理)'''from selenium im ...
- 并发编程学习笔记(11)----FutureTask的使用及实现
1. Future的使用 Future模式解决的问题是.在实际的运用场景中,可能某一个任务执行起来非常耗时,如果我们线程一直等着该任务执行完成再去执行其他的代码,就会损耗很大的性能,而Future接口 ...
- 《C++ Primer Plus》学习笔记11
<C++ Primer Plus>学习笔记11 第17章 输入.输出和文件 <<<<<<<<<<<<<< ...
- SpringMVC:学习笔记(11)——依赖注入与@Autowired
SpringMVC:学习笔记(11)——依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...
- Spring 源码学习笔记11——Spring事务
Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...
- 汇编学习笔记(11)int指令和端口
格式 int指令也是一种内中断指令,int指令的格式为int n,n是中断类型码.也就是说,使用int指令可以调用任意的中断例程,例如我们可以显示的调用0号中断例程,还记得在汇编学习笔记(10)中我们 ...
随机推荐
- springmvc转页面
@RequestMapping("/aa") public String zuan(){ return "redirect:/bb.jsp"; } 如果没有带r ...
- Mask RCNN 源码阅读(update)
之前看了Google官网的object_dectect 的源码,感觉Google大神写的还不错.最近想玩下Mask RCNN,就看了下源码,这里刚好当做总结和梳理.链接如下: Google官网的obj ...
- jQuery的appendTo案例
案例要求:点击双击第一个下拉列表框的选项可以把对应选项移到第二个下拉列表框中,选中第一个列表框的选项(可多选)单击-->按钮可使被选中项移动到右边下拉列表框中,单击==>按钮时将左边的所有 ...
- linux下配置redis4.0.2主从复制以及高可用
一.环境 三台服务器分别为: 172.28.18.75/172.28.18.103/172.28.18.104 在三台服务器上分别部署一个redis节点以及一个sentinel节点 二.主从复制配置 ...
- JAVA中的配置文件XML
一:概念 1.XML Extensible markup Language 可拓展标记语言 2.功能:存储数据(配置文件,在网络中传输数据) 3.html和xml的区别 3.1xml标记全是自定义的 ...
- CentOS6.8 使man支持显示中文
1.安装显示中文的man命令 wget https://src.fedoraproject.org/repo/pkgs/man-pages-zh-CN/manpages-zh-1.5.1.tar.gz ...
- 清理SqlServer日志
最近做一个数据采集的项目,使用SQLSserver2014数据库 没想到数据才采集两三天,C盘空间已经剩下8M 连忙看了一下SQLSerevr数据库文件夹 位于 C:\Program Files\Mi ...
- 原子性: Interlocked 类
public class CounterNoLock:CountBase { private int _count; public int Count { get { return _count; } ...
- 关于深度学习中的batch_size
5.4.1 关于深度学习中的batch_size 举个例子: 例如,假设您有1050个训练样本,并且您希望设置batch_size等于100.该算法从训练数据集中获取前100个样本(从第1到第100个 ...
- 项目总结18-使用textarea无法判断空值之坑
项目总结18-使用textarea无法判断空值之坑 今天使用js判断textarea为空,发现怎么都无法成功仔细做了对比测试,发现结果如下: 1-JS代码 if($("#content&qu ...