玩轉Node.js-Sequelize數據遷移


數據庫遷移就像git一樣,我們可以使用Sequelize遷移來幫助我們跟蹤數據庫的更改,並在各個不同時期的數據庫狀態之間進行切換,使用Sequelize遷移,需要安裝 sequelize-cli 工具。

安裝sequelize-cli

由於sequelize-cli依賴於sequelize包,sequelize又需要使用mysql2包來連接數據庫,所以我們需要安裝三個包。

npm i sequelize mysql2 sequelize-cli

如果是局部安裝方式的話,安裝完成之后進入node_modules目錄下面的.bin目錄下執行sequelizse-cli命令來測試sequelize-cli是否安裝成功。

運行成功會出現下面信息。

1607738318387

初始化項目

執行sequelize-cli init命令初始化sequelize項目,成功執行之后會創建4個文件夾。

1607738888421

  • config: 包含配置文件,它高速CLI如何連接數據庫
  • models: 包含你項目的所有模型
  • migrations: 包含所有遷移文件
  • seeders: 包含所有種子文件

config文件夾中的config.json配置有3個環境,分別是開始環境、測試環境、生產環境。

1607739072441

創建數據庫

sequelize-cli會根據config/config.json里面的環境配置信息自動為我們創建數據庫,默認情況會根據開發環境信息進行配置。

1607739581747

可以看到數據庫成功創建。

1607739622637

刪除數據庫

sequelize-cli db:drop命令會根據配置信息刪除數據庫。

1607739823236

自定義環境變量

1.設置環境變量。

#設置環境變量NODE_ENV的值為home
set NODE_ENV=home
#刪除環境變量,此時會得到home
echo %NODE_ENV%
#還原NODE_ENV的環境變量
set NODE_ENV=

2.在config/config.json中新增一項環境配置。

  "home": {
    "username": "root",
    "password": "root",
    "database": "c4az6_home",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },

3.再使用sequelize-cli創建數據庫就會創建出home環境配置下的數據庫了。

1607740330502

創建模型

使用model:generate或者model:create命令創建一個模型文件

參數:

  • --name:模型名稱,必須
  • --attributes:字段列表,必須

參考

sequelize-cli model:create --name User --attributes username:STRING

1607741150172

注意:模型文件是給程序用的,遷移文件和種子文件是給sequelize-cli使用的。

執行遷移

所謂遷移,就是對數據庫進行結構的創建、升級(修改)等操作。

使用db:migrate會找到遷移文件,然后執行里面的代碼創建表和字段,同時會在數據庫中創建一個sequelizemeta的表來記錄遷移的腳本名稱。

1607741921213

注意db:migrate不能對相同的表反復遷移,會報錯。

1607741993158

我們可以通過db:migrate:status命令查看遷移文件的狀態。

1607742152284

這個時候,如果有新的需求,要新增表,那么可以通過下面步驟實現。

1.首先還是創建模型。

1607742284397

2.查看狀態發現為down,就是未遷移狀態。

1607742353374

3.遷移。

1607742427380

4.連接數據庫進行查看。

1607742509909

撤銷遷移

db:migrate:undo命令會撤銷最近的一次遷移操作,會刪除最近一次創建的表,會把sequelizemeta表里面的最近一次記錄刪除。

有時候我們撤銷不一定就非要刪表,我們可能會有其他動作,這個時候我們就可以通過手動修改遷移腳本中的down函數代碼來實現自定義撤銷操作。

1607744130113

另外我們還可以通過db:migrate:undo:all命令來撤銷所有的遷移腳本。

通過db:migrate:undo --name 腳本名命令指定撤銷具體的遷移腳本。

sequelize-cli db:migrate:undo 20201212030431-create-message.js

那么如何遷移單個指定的文件呢?一般情況下我們要遷移的文件都應該是放在一個單獨的文件夾下面的,然后通過下面命令指定遷移目錄即可。

1607745692178

在表中添加字段

如何在不影響表原有的情況下添加新的字段?例如我們給users表中增加一個age字段。

創建遷移文件。

sequelize-cli migration:create --name UserAddAge

創建之后找到遷移腳本文件,然后在up和down中增加如下代碼。

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
    /**
     * Add altering commands here.
     *
     * Example:
     * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
     */
    await queryInterface.addColumn(
      'users',
      'age', {
        type: Sequelize.TINYINT
      }
    )
  },

  down: async (queryInterface, Sequelize) => {
    /**
     * Add reverting commands here.
     *
     * Example:
     * await queryInterface.dropTable('users');
     */
    await queryInterface.removeColumn(
      'users',
      'age'
    )
  }
};

addColumn這個API的第一個參數是你要添加列的表名,age是添加的字段,type是數據類型。

removeColumn這個API是刪除列。

添加代碼之后再執行db:migrate命令發現已經有了age字段了。

1607775853301

如果我們撤銷的話,也不會影響原有的users表結構,只會把users表中的age字段刪除。

撤銷最近一次遷移:db:migrate:undo

種子文件seeder

比如往表里面添加測試數據的時候我們就可以使用種子文件來實現。

創建種子文件

命令:sequelize-cli seed:create --name userTest

1607776268462

添加測試數據

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
    /**
     * Add seed commands here.
     *
     * Example:
     * await queryInterface.bulkInsert('People', [{
     *   name: 'John Doe',
     *   isBetaMember: false
     * }], {});
    */
    await queryInterface.bulkInsert('users', [
      {
        username: '張三',
        age: 20
      },
      {
        username: '李四',
        age: 21
      }
    ])
  },

  down: async (queryInterface, Sequelize) => {
    /**
     * Add commands to revert seed here.
     *
     * Example:
     * await queryInterface.bulkDelete('People', null, {});
     */
    await queryInterface.bulkDelete('users', null, {});
  }
};

up函數里面的bulkInsertAPI第一個參數是要操作的表名,第二個參數是要插入的數據,是一個數組對象的格式。

down函數里面的bulkDeleteAPI是用來刪除數據的,這里是將users表的數據清空。

運行種子文件

命令:sequelize-cli db:seed:all

1607776758906

  • 指定運行種子文件:db:seed 種子文件
  • 運行所有種子文件:db:seed:all

撤銷種子文件

命令:sequelize-cli db:seed:undo

  • 指定撤銷種子文件:db:seed:undo 種子文件
  • 撤銷所有種子文件:db:seed:undo:all

如果哪天測試數據被我玩壞了,用這個命令就可以很方便的還原。

種子文件添加、撤銷默認沒有進行記錄,因此我們需要手動添加記錄,方便以后查看、溯源。

官方文檔告訴我們需要在config/config.json配置文件中添加配置。

通過JSON的方式存儲。

"development": {
    "username": "root",
    "password": "root",
    "database": "c4az6_development",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "seederStorage": "json",
    "seederStoragePath": "userTestDataLog.json"
}

通過數據庫存儲。

  "development": {
    "username": "root",
    "password": "root",
    "database": "c4az6_development",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "seederStorage": "sequelize",
    "seederStorageTableName": "userTestDataLog"
  },

1607778464267

注意:migration遷移的記錄默認使用數據庫存儲,seeder種子文件生成的記錄默認是沒有存儲的,需要手動在config/config.json中配置,要么使用JSON文件方式並且配置存儲路徑進行存儲,要么使用數據庫的方式存儲。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM