背景
在作後臺接口開發時,咱們總會遇到新增字段或者修改字段的問題。
在開發階段咱們能夠刪表重建,可是上線以後可不能這麼搞了。因此數據遷移就很重要了。javascript
所謂的數據遷移原理其實就是將數據複製出來而後再把表刪了從新建表同時把數據再複製進去。java
這裏我用到的ORM
是Sequelize
因此下面簡單介紹一下Sequelize
實現數據遷移的過程。mysql
實現
安裝 sequelize/cli 依賴
npm install --save-dev sequelize-cli
初始化
在項目目錄(我這裏是starter
)執行下面的命令git
npx sequelize-cli init
會在當前目錄下生成相關目錄以下:
github
config/config.json
:包含配置文件,它告訴CLI
如何鏈接數據庫。可直接從項目的數據庫配置中複製過來,內容以下:
{ "development": { "username": "root", "password": "數據庫密碼", "database": "lin-cms", "host": "localhost", "dialect": "mysql" }, "test": { "username": "root", "password": "數據庫密碼", "database": "lin-cms", "host": "localhost", "dialect": "mysql" }, "production": { "username": "root", "password": "數據庫密碼", "database": "lin-cms", "host": "localhost", "dialect": "mysql" } }
migrations
:包含全部遷移文件。數據遷移的主要文件,後面介紹。seeders
:包含全部種子文件。使用樣本數據或測試數據填充數據庫表時可使用seeders
文件去實現。好比向用戶表中插入用戶:
module.exports = { up: (queryInterface, Sequelize) => { return queryInterface.bulkInsert('Users', [{ firstName: 'John', lastName: 'Doe', email: 'example@example.com', createdAt: new Date(), updatedAt: new Date() }]); }, down: (queryInterface, Sequelize) => { return queryInterface.bulkDelete('Users', null, { }); } };
models
:包含你的項目的全部模型。
實現數據遷移
目的是要在已經存在的
goods
表中增長pay_type
字段,而且不刪除表中的數據。web
咱們先按照上面的步驟完成初始化以後,就能夠建立遷移文件了。
可經過以下命令建立文件:sql
npx sequelize-cli migration:generate --name migration-good-add-paytype-column
migration-good-add-paytype-column
:是咱們的遷移文件名稱
執行完以後會在migrations
文件夾下生成文件:
接下來就是在該文件中編寫遷移邏輯了,文件內容以下:數據庫
'use strict'; module.exports = { up: async (queryInterface, Sequelize) => { /** * Add altering commands here. 更新的操做 * * Example: * await queryInterface.createTable('users', { id: Sequelize.INTEGER }); */ return queryInterface.sequelize.transaction(t => { return Promise.all([ // 在 goods 表中增長 string 類型的 pay_type 字段 queryInterface.addColumn('Goods', 'pay_type', { type: Sequelize.DataTypes.STRING }, { transaction: t }), ]); }); }, down: async (queryInterface, Sequelize) => { /** * Add reverting commands here. 回退的操做 * * Example: * await queryInterface.dropTable('users'); */ } };
編寫完遷移邏輯以後,執行以下命令便可完成數據遷移:npm
npx sequelize-cli db:migrate
最後咱們能夠在數據庫表中看到已經在現有數據的基礎上增長了pay_type
字段。
json
多表依賴可參考文檔中的介紹。
Sequelize 高級專題
TIP:
在新增完字段以後,應該還須要在原有的Model
對象裏面添加,如這裏是model/good.js
須要增長pay_type
不然添加商品信息該字段沒有添加成功。(目前測試是這樣)
import sequelize from '../lib/db'; import { Sequelize } from 'sequelize'; import { GoodParentCategory } from './good-category'; // 這是咱們用於如下示例的模型的設置 const Good = sequelize.define('good', { id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true }, title: { type: Sequelize.STRING(50), allowNull: false }, // 新增 brand:{ type: Sequelize.STRING(50), allowNull: false }, image: { type: Sequelize.STRING(100), allowNull: false }, category: { type: Sequelize.STRING(10), allowNull: false }, stock: { type: Sequelize.INTEGER, allowNull: false }, original_price: { type: Sequelize.INTEGER, allowNull: false }, price: { type: Sequelize.INTEGER, allowNull: false }, // 新增 pay_type:{ type: Sequelize.STRING(10), allowNull: false }, summary: { type: Sequelize.STRING(1000), allowNull: false }, }); GoodParentCategory.hasMany(Good); Good.belongsTo(GoodParentCategory); export { Good };
參考
本文同步分享在 博客「_龍衣」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。