详解sequelize-cli管理数据库

Sequelize迁移来帮助我们跟踪数据库的更改,并在各个不同时期的数据库状态之间进行切换

新建文件夹 seq 通过命令行工具进入该文件夹下

npm init --yes

会生成一个package.json

1. 安装

npm i sequelize-cli --save-dev

sequelize-cli 的依赖是 sequelize sequelize的依赖是mysql2 需要自己手动安装

然后安装

npm i sequelize

我要用mysql演示 安装mysql2

npm i mysql2

我们是局部安装所以执行时需要这样

./node_modules/.bin/sequelize-cli --version
# 或者
./node_modules/.bin/sequelize --version

利用npx可以这样子写(npx教程

npx sequelize-cli --version
# 或者
npx sequelize --version

先执行看看所有命令了解

npx sequelize
image

2. 初始化

sequelize init

初始化sequelize项目,该命令将创建如下目录:

  • config:包含配置文件,它告诉CLI如何连接数据库

  • models:包含您的项目的所有模型

  • migrations:包含所有迁移文件 (数据表结构

  • seeders:包含所有种子文件 (具体数据

image

优先打开config下的config.json

{
  "development": {
    "username": "root",
    "password": "123456",
    "database": "list",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "operatorsAliases": false
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "operatorsAliases": false
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "operatorsAliases": false
  }
}

配置在不同环境下数据库连接和密码 dialect 是你要操作的数据库类型,当前我使用的是mysql 也就是说sequelize支持什么数据库他就支持啥数据库, 默认当前环境为开发环境

config.json配置完成后

3. 创建数据库和删除数据库

npx sequelize db:create

他会根据你config.json 中添加的数据名称创建

出师不利,立马报错了。如下显示。就是告诉你这个版本不需要这条。请删掉

image

那就删除config.json中的

"operatorsAliases": false

再执行。成功创建

image

执行删除

npx sequelize db:drop list
image

删除成功

记得再安装回来测试接下来操作。。。

4. 创建模型文件 model

model:generate / model:create

创建一个模型文件

-- name:模型名称,必须

-- attributes:字段列表,必须

新建一个表名为user 字段有username 和sex的表模型,运行以下命令

npx sequelize model:generate --name user --attributes username:string,sex:string
image
  • 在 models 文件夹中创建了一个 user 模型文件(供程序使用)

  • 在 migrations 文件夹中创建了一个名字像 xxxxxxxx-create-user.js 的迁移文件(供迁移使用)

image

user.js 文件

'use strict';
module.exports = (sequelize, DataTypes) => {
  const user = sequelize.define('user', {
    username: DataTypes.STRING,
    sex: DataTypes.STRING
  }, {});
  user.associate = function(models) {
    // associations can be defined here
  };
  return user;
};

202006050222227-create-user.js

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      username: {
        type: Sequelize.STRING
      },
      sex: {
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('users');
  }
};

文件虽然建完了,但是数据库里却啥也没有

image

需要执行以下命令才能写入数据库

也就是我们核心要做的执行迁移

5. 执行迁移

所谓迁移,就是对数据库进行结构的创建,升级(修改)等操作

db:migrate

  • 会在数据库中创建一个 SequelizeMeta 表,用于记录每次的迁移记录

  • 执行 migrations 文件下的满足条件(SequelizeMeta表)的脚本

px sequelize db:migrate
image

看数据库

image

而且还多了一个SequelizeMeta的表记录迁移记录

image

如果再执行一次迁移文件会不会对数据库造成更改呢?答案是否定的,不会的

image

看一下当前状态

npx sequelize db:migrate:status

既然能写入一定还能恢复,否则就失去意义了

6.回退迁移操作

撤销迁移

db:migrate:undo - 撤销上一次的迁移操作

db:migrate:undo:all - 撤销所有的迁移操作

db:migrate:undo --name 具体迁移脚本

测试

npx sequelize db:migrate:undo
image

此时状态

image

重要:这就说明了,如果当前文件未被执行过,状态为down 执行过则为 up

当你执行迁移时执行的是迁移js文件中的,up函数。反之则是down函数 (这里可以仔细看一下migrations文件夹下的文件具体函数)

迁移文件和种子文件都是有工具初始化,自己编写

queryInterface文档: https://sequelize.org/master/class/lib/dialects/abstract/query-interface.js~QueryInterface.html

包括增加字段,删除字段,还有种子文件要用到增加数据等

举例说明

先执行了刚才的迁移文件

这是当前users表里的结构

image

我们现在要添加一个字段 lastname

新建一个迁移文件

npx sequelize migration:create --name addLastname

image

打开生成的这个js文件 改写

'use strict';

module.exports = {
  up: (queryInterface, Sequelize) => {
    /*
      Add altering commands here.
      Return a promise to correctly handle asynchronicity.

      Example:
      return queryInterface.createTable('users', { id: Sequelize.INTEGER });
    */
    return queryInterface.addColumn('user', 'lastname', Sequelize.STRING);
  },

  down: (queryInterface, Sequelize) => {
    /*
      Add reverting commands here.
      Return a promise to correctly handle asynchronicity.

      Example:
      return queryInterface.dropTable('users');
    */
    return queryInterface.removeColumn('user', 'lastname', Sequelize.STRING);
  }
};

执行迁移操作

image
image

成功,其他操作api查看文档

queryInterface文档: https://sequelize.org/master/class/lib/dialects/abstract/query-interface.js~QueryInterface.html

7. 种子文件

种子文件

迁移文件是用来构建数据库以及表结构的,种子文件是用来构建数据的

seed:generate --name demo-user (自定义的名字)

种子文件脚本与迁移脚本类似,由up于down函数组成,传入的参数也是一致的

先生成种子文件 name 后边接的是自定义的名字

npx sequelize seed:generate --name userseed
image
image

打开这个文件

'use strict';

module.exports = {
  up: (queryInterface, Sequelize) => {
    /*
      Add altering commands here.
      Return a promise to correctly handle asynchronicity.

      Example:
      return queryInterface.bulkInsert('People', [{
        name: 'John Doe',
        isBetaMember: false
      }], {});
    */
  },

  down: (queryInterface, Sequelize) => {
    /*
      Add reverting commands here.
      Return a promise to correctly handle asynchronicity.

      Example:
      return queryInterface.bulkDelete('People', null, {});
    */
  }
};

很明显是空的,想要添加数据需要自己写

测试添加一条数据

'use strict';

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.bulkInsert('users', [{
      username: 'John Doe',
      sex: 'man',
      lastname: 'hello',
      createdAt: '2020-06-09 11:56:21',
      updatedAt: '2020-06-09 11:56:21'
    }], {});
  },

  down: (queryInterface, Sequelize) => {
    return queryInterface.bulkDelete('users', null, {});
  }
};

执行种子

db:seed 指定种子文件 运行指定种子文件

db:seed:all 运行所有种子文件

npx sequelize db:seed:all
image

看数据库

image

8. 撤销种子执行

db:seed:undo --seed 指定种子文件 撤销指定种子文件

db:seed:undo:all 撤销所有种子文件

npx sequelize db:seed:undo:all
image

数据库中刚才添加的数据不见了。

9.种子存储记录

存储记录

默认情况下seed不记录过程,如果需要记录则需要单独设置,在配置文件config.json中增加

seederStorage

存储引擎:none、json、mongodb、sequelize

seederStoragePath 存储路径(json有效)

seederStorageTableName 存储表名,mongodb和sequelize有效

举一个例子

config.json

{
  "development": {
    "username": "root",
    "password": "123456",
    "database": "list",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "seederStorage": "json",
    "seederStoragePath": "./seeder.json"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}
image

然后我们在执行种子文件

image

这时候多出个文件

image

打开seeder.json

[
  "20200605031821-userseed.js"
]

这个类似于我们SequelizeMeta表中的内容

image

10. 关于文档查看

https://sequelize.org/master/

在左侧列表里找

image

即可找到 sequelize-cli 相关的文档。

sequelize其他Api

https://sequelize.org/master/identifiers.html

源文章来源:https://www.cnblogs.com/jianghaijun4031/p/13231846.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容