詳解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

 

2. 初始化

sequelize init

初始化sequelize項目,該命令將創建如下目錄:             

- config:包含配置文件,它告訴CLI如何連接數據庫             

- models:包含您的項目的所有模型           

 - migrations:包含所有遷移文件 (數據表結構)           

 - seeders:包含所有種子文件 (具體數據

優先打開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 中添加的數據名稱創建

出師不利,立馬報錯了。如下顯示。就是告訴你這個版本不需要這條。請刪掉

那就刪除config.json中的

"operatorsAliases": false

再執行。成功創建

執行刪除

npx sequelize db:drop list

刪除成功

記得再安裝回來測試接下來操作。。。

4. 創建模型文件 model

 model:generate / model:create             

創建一個模型文件             

-- name:模型名稱,必須             

-- attributes:字段列表,必須     

新建一個表名為user 字段有username 和sex的表模型,運行以下命令

npx sequelize model:generate --name user --attributes username:string,sex:string

- 在 models 文件夾中創建了一個 user 模型文件(供程序使用)             

- 在 migrations 文件夾中創建了一個名字像 xxxxxxxx-create-user.js 的遷移文件(供遷移使用)

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');
  }
};

文件雖然建完了,但是數據庫里卻啥也沒有

需要執行以下命令才能寫入數據庫

也就是我們核心要做的執行遷移

5. 執行遷移

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

db:migrate      

- 會在數據庫中創建一個 SequelizeMeta 表,用於記錄每次的遷移記錄             

- 執行 migrations 文件下的滿足條件(SequelizeMeta表)的腳本

px sequelize db:migrate

看數據庫

而且還多了一個SequelizeMeta的表記錄遷移記錄

如果再執行一次遷移文件會不會對數據庫造成更改呢?答案是否定的,不會的

看一下當前狀態

npx sequelize db:migrate:status

既然能寫入一定還能恢復,否則就失去意義了

6.回退遷移操作

撤銷遷移         

db:migrate:undo             - 撤銷上一次的遷移操作         

db:migrate:undo:all             - 撤銷所有的遷移操作         

db:migrate:undo --name 具體遷移腳本

測試

npx sequelize db:migrate:undo

此時狀態

重要:這就說明了,如果當前文件未被執行過,狀態為down 執行過則為 up

當你執行遷移時執行的是遷移js文件中的,up函數。反之則是down函數 (這里可以仔細看一下migrations文件夾下的文件具體函數)

 

遷移文件和種子文件都是有工具初始化,自己編寫

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

包括增加字段,刪除字段,還有種子文件要用到增加數據等

舉例說明

先執行了剛才的遷移文件

這是當前users表里的結構

我們現在要添加一個字段 lastname

新建一個遷移文件

npx sequelize migration:create --name addLastname

打開生成的這個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);
  }
};

執行遷移操作

成功,其他操作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

打開這個文件

'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

看數據庫

8. 撤銷種子執行

db:seed:undo --seed 指定種子文件             撤銷指定種子文件         

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

npx sequelize db:seed:undo:all

數據庫中剛才添加的數據不見了。

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"
  }
}

然后我們在執行種子文件

這時候多出個文件

打開seeder.json

[
  "20200605031821-userseed.js"
]

這個類似於我們SequelizeMeta表中的內容

 

10. 關於文檔查看

https://sequelize.org/master/

在左側列表里找

 

即可找到 sequelize-cli 相關的文檔。

sequelize其他Api 

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

 


免責聲明!

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



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