Sequelize 中文文檔 v4 - Migrations - 遷移

Migrations - 遷移

此係列文章的應用示例已發佈於 GitHub: sequelize-docs-Zh-CN. 能夠 Fork 幫助改進或 Star 關注更新. 歡迎 Star.html

就像您使用Git / SVN來管理源代碼的更改同樣,您可使用遷移來跟蹤數據庫的更改。 經過遷移,您能夠將現有的數據庫轉移到另外一個狀態,反之亦然:這些狀態轉換將保存在遷移文件中,它們描述瞭如何進入新狀態以及如何還原更改以恢復舊狀態。node

您將須要Sequelize CLI。 CLI支持遷移和項目引導。mysql

命令行界面

安裝命令行界面

讓咱們從安裝CLI開始,你能夠在 這裏 找到說明。 最推薦的方式是這樣安裝git

$ npm install --save sequelize-cli

引導

要建立一個空項目,你須要執行 init 命令github

$ node_modules/.bin/sequelize init

這將建立如下文件夾sql

  • config, 包含配置文件,它告訴CLI如何鏈接數據庫
  • models,包含您的項目的全部模型
  • migrations, 包含全部遷移文件
  • seeders, 包含全部種子文件

結構

在繼續進行以前,咱們須要告訴 CLI 如何鏈接到數據庫。 爲此,能夠打開默認配置文件 config/config.json。 看起來像這樣數據庫

{
  development: {
    username: 'root',
    password: null,
    database: 'database_development',
    host: '127.0.0.1',
    dialect: 'mysql'
  },
  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'
  }
}

如今編輯此文件並設置正確的數據庫憑據和方言。npm

注意: 若是你的數據庫還不存在,你能夠調用 db:create 命令。 經過正確的訪問,它將爲您建立該數據庫。編程

建立第一個模型(和遷移)

一旦您正確配置了CLI配置文件,您就能夠首先建立遷移。 它像執行一個簡單的命令同樣簡單。json

咱們將使用 model:generate 命令。 此命令須要兩個選項

  • name, 模型的名稱
  • attributes, 模型的屬性列表

讓咱們建立一個名叫 User 的模型

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

這將發生如下事情

  • models 文件夾中建立了一個 user 模型文件
  • migrations 文件夾中建立了一個名字像 XXXXXXXXXXXXXX-create-user.js 的遷移文件

注意: Sequelize 將只使用模型文件,它是表描述。另外一邊,遷移文件是該模型的更改,或更具體的是說 CLI 所使用的表。 處理遷移,如提交或日誌,以進行數據庫的某些更改。

運行遷移

直到這一步,CLI沒有將任何東西插入數據庫。 咱們剛剛爲咱們的第一個模型 User 建立了必需的模型和遷移文件。 如今要在數據庫中實際建立該表,須要運行 db:migrate 命令。

$ node_modules/.bin/sequelize db:migrate

此命令將執行這些步驟

  • 將在數據庫中確保一個名爲 SequelizeMeta 的表。 此表用於記錄在當前數據庫上運行的遷移
  • 開始尋找還沒有運行的任何遷移文件。 這能夠經過檢查 SequelizeMeta 表。 在這個例子中,它將運行咱們在最後一步中建立的 XXXXXXXXXXXXXX-create-user.js 遷移,。
  • 建立一個名爲 User 的表,其中包含其遷移文件中指定的全部列。

撤消遷移

如今咱們的表已建立並保存在數據庫中。 經過遷移,只需運行命令便可恢復爲舊狀態。

您可使用 db:migrate:undo,這個命令將會恢復最近的遷移。

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

經過使用 db:migrate:undo:all 命令撤消全部遷移,能夠恢復到初始狀態。 您還能夠經過將其名稱傳遞到 --to 選項中來恢復到特定的遷移。

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

建立第一個種子

假設咱們但願在默認狀況下將一些數據插入到幾個表中。 若是咱們跟進前面的例子,咱們能夠考慮爲 User 表建立演示用戶。

要管理全部數據遷移,您可使用 seeders。 種子文件是數據的一些變化,可用於使用樣本數據或測試數據填充數據庫表。

讓咱們建立一個種子文件,它會將一個演示用戶添加到咱們的 User 表中。

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

這個命令將會在 seeders 文件夾中建立一個種子文件。文件名看起來像是 XXXXXXXXXXXXXX-demo-user.js,它遵循相同的 up/down 語義,如遷移文件。

如今咱們應該編輯這個文件,將演示用戶插入User表。

'use strict';

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.bulkInsert('Users', [{
        firstName: 'John',
        lastName: 'Doe',
        email: 'demo@demo.com'
      }], {});
  },

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

運行種子

在上一步中,你建立了一個種子文件。 但它尚未保存到數據庫。 爲此,咱們須要運行一個簡單的命令。

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

這將執行該種子文件,您將有一個演示用戶插入 User 表。

注意: seeders 執行不會存儲在任何使用 SequelizeMeta 表的遷移的地方。 若是你想覆蓋這個,請閱讀 存儲 部分

撤銷種子

Seeders 若是使用了任何存儲那麼就能夠被撤消。 有兩個可用的命令

若是你想撤消最近的種子

node_modules/.bin/sequelize db:seed:undo

若是你想撤消全部的種子

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

高級專題

遷移框架

如下框架顯示了一個典型的遷移文件。

module.exports = {
  up: (queryInterface, Sequelize) => {
    // 轉變爲新狀態的邏輯
  },
 
  down: (queryInterface, Sequelize) => {
    // 恢復更改的邏輯
  }
}

傳遞的 queryInterface 對象能夠用來修改數據庫。 Sequelize 對象存儲可用的數據類型,如 STRINGINTEGER。 函數 updown 應該返回一個 Promise 。 讓咱們來看一個例子

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Person', {
        name: Sequelize.STRING,
        isBetaMember: {
          type: Sequelize.BOOLEAN,
          defaultValue: false,
          allowNull: false
        }
      });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Person');
  }
}

.sequelizerc 文件

這是一個特殊的配置文件。 它容許您指定一般做爲參數傳遞給CLI的各類選項。 在某些狀況下,您可使用它。

  • 你想要覆蓋到 migrations, models, seedersconfig 文件夾的路徑.
  • 你想要重命名 config.json 成爲別的名字好比 database.json

還有更多的, 讓咱們看一下如何使用這個文件進行自定義配置。

對於初學者,能夠在項目的根目錄中建立一個空文件。

$ touch .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')
}

經過這個配置你告訴CLI:

  • 使用 config/database.json 文件來配置設置
  • 使用 db/models 做爲模型文件夾
  • 使用 db/seeders 做爲種子文件夾
  • 使用 db/migrations 做爲遷移文件夾

動態配置

配置文件是默認的一個名爲 config.json 的JSON文件。 但有時你想執行一些代碼或訪問環境變量,這在JSON文件中是不可能的。

Sequelize CLI能夠從「JSON」和「JS」文件中讀取。 這能夠用.sequelizerc文件設置。 讓咱們來看一下

首先,您須要在項目的根文件夾中建立一個 .sequelizerc 文件。 該文件應該覆蓋 JS 文件的配置路徑。 推薦這個

const path = require('path');

module.exports = {
  'config': path.resolve('config', 'config.js')
}

如今,Sequelize CLI將加載 config/config.js 以獲取配置選項。 因爲這是一個JS文件,您能夠執行任何代碼並導出最終的動態配置文件。

一個 config/config.js 文件的例子

const fs = require('fs');

module.exports = {
  development: {
    username: 'database_dev',
    password: 'database_dev',
    database: 'database_dev',
    host: '127.0.0.1',
    dialect: 'mysql'
  },
  test: {
    username: 'database_test',
    password: null,
    database: 'database_test',
    host: '127.0.0.1',
    dialect: 'mysql'
  },
  production: {
    username: process.env.DB_USERNAME,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
    host: process.env.DB_HOSTNAME,
    dialect: 'mysql',
    dialectOptions: {
      ssl: {
        ca: fs.readFileSync(__dirname + '/mysql-ca-master.crt')
      }
    }
  }
};

使用環境變量

使用CLI,您能夠直接訪問 config/config.js 內的環境變量。 您可使用 .sequelizerc 來告訴CLI使用 config/config.js 進行配置。 這在上一節中有所解釋。

而後你可使用正確的環境變量來暴露文件。

module.exports = {
  development: {
    username: 'database_dev',
    password: 'database_dev',
    database: 'database_dev',
    host: '127.0.0.1',
    dialect: 'mysql'
  },
  test: {
    username: process.env.CI_DB_USERNAME,
    password: process.env.CI_DB_PASSWORD,
    database: process.env.CI_DB_NAME,
    host: '127.0.0.1',
    dialect: 'mysql'
  },
  production: {
    username: process.env.PROD_DB_USERNAME,
    password: process.env.PROD_DB_PASSWORD,
    database: process.env.PROD_DB_NAME,
    host: process.env.PROD_DB_HOSTNAME,
    dialect: 'mysql'
  }

指定方言選項

有時你想指定一個 dialectOption,若是它是一個通用配置,你能夠將其添加到 config/config.json 中。 有時你想執行一些代碼來獲取 dialectOptions,你應該爲這些狀況使用動態配置文件。

{
    "production": {
        "dialect":"mysql",
        "dialectOptions": {
            "bigNumberStrings": true
        }
    }
}

生產用途

有關在生產環境中使用CLI和遷移設置的一些提示。

1) 使用環境變量進行配置設置。 這是經過動態配置更好地實現的。 樣品生產安全配置可能看起來像

const fs = require('fs');

module.exports = {
  development: {
    username: 'database_dev',
    password: 'database_dev',
    database: 'database_dev',
    host: '127.0.0.1',
    dialect: 'mysql'
  },
  test: {
    username: 'database_test',
    password: null,
    database: 'database_test',
    host: '127.0.0.1',
    dialect: 'mysql'
  },
  production: {
    username: process.env.DB_USERNAME,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
    host: process.env.DB_HOSTNAME,
    dialect: 'mysql',
    dialectOptions: {
      ssl: {
        ca: fs.readFileSync(__dirname + '/mysql-ca-master.crt')
      }
    }
  }
};

咱們的目標是爲各類數據庫祕密使用環境變量,而不是意外檢查它們來源控制。

存儲

可使用三種類型的存儲:sequelizejsonnone

  • sequelize : 將遷移和種子存儲在 sequelize 數據庫的表中
  • json : 將遷移和種子存儲在json文件上
  • none : 不存儲任何遷移/種子

遷移存儲

默認狀況下,CLI 將在您的數據庫中建立一個名爲 SequelizeMeta 的表,其中包含每一個執行遷移的條目。 要更改此行爲,能夠在配置文件中添加三個選項。 使用 migrationStorage 能夠選擇要用於遷移的存儲類型。 若是選擇 json,可使用 migrationStoragePath 指定文件的路徑,或者 CLI 將寫入 sequelize-meta.json 文件。 若是要將數據保存在數據庫中,請使用 sequelize,可是要使用其餘表格,可使用 migrationStorageTableName.

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

注意: 不推薦使用 none 存儲做爲遷移存儲。 若是您決定使用它,請注意將會沒有任何移動記錄或沒有運行的記錄.

種子儲存

默認狀況下,CLI 不會保存任何被執行的種子。 若是您選擇更改此行爲(!),則能夠在配置文件中使用 seederStorage 來更改存儲類型。 若是選擇 json,可使用 seederStoragePath 指定文件的路徑,或者 CLI 將寫入文件 sequelize-data.json。 若是要將數據保存在數據庫中,請使用 sequelize,您可使用 seederStorageTableName 指定表名,不然將默認爲SequelizeData

{
  "development": {
    "username": "root",
    "password": null,
    "database": "database_development",
    "host": "127.0.0.1",
    "dialect": "mysql",
    // 使用不一樣的存儲空間. Default: none
    "seederStorage": "json",
    // 使用不一樣的文件名. Default: sequelize-data.json
    "seederStoragePath": "sequelizeData.json",
    // 使用不一樣的表名 Default: SequelizeData
    "seederStorageTableName": "sequelize_data"
  }
}

配置鏈接字符串

做爲 --config 選項的替代方法,可使用定義數據庫的配置文件,您可使用 --url 選項傳遞鏈接字符串。 例如:

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

經過SSL鏈接

確保ssl在 dialectOptions 和基本配置中指定。

{
    "production": {
        "dialect":"postgres",
        "ssl": true,
        "dialectOptions": {
            "ssl": true
        }
    }
}

程序化使用

Sequelize 有一個 姊妹庫,用於以編程方式處理遷移任務的執行和記錄。

查詢界面

使用 queryInterface 對象描述以前,您能夠更改數據庫模式。 查看完整的公共方法列表,它支持 QueryInterface API

若是這篇文章對您有幫助, 感謝 下方點贊 或 Star GitHub: sequelize-docs-Zh-CN 支持, 謝謝.

相關文章
相關標籤/搜索