此係列文章的應用示例已發佈於 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
對象存儲可用的數據類型,如 STRING
或 INTEGER
。 函數 up
或 down
應該返回一個 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
, seeders
或 config
文件夾的路徑.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') } } } };
咱們的目標是爲各類數據庫祕密使用環境變量,而不是意外檢查它們來源控制。
可使用三種類型的存儲:sequelize
,json
和none
。
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在 dialectOptions
和基本配置中指定。
{ "production": { "dialect":"postgres", "ssl": true, "dialectOptions": { "ssl": true } } }
Sequelize 有一個 姊妹庫,用於以編程方式處理遷移任務的執行和記錄。
使用 queryInterface
對象描述以前,您能夠更改數據庫模式。 查看完整的公共方法列表,它支持 QueryInterface API
若是這篇文章對您有幫助, 感謝 下方點贊 或 Star GitHub: sequelize-docs-Zh-CN 支持, 謝謝.