NodeJS 後端開發 - 使用 sequelize/cli 實現 mysql 數據遷移

背景

在作後臺接口開發時,咱們總會遇到新增字段或者修改字段的問題。
在開發階段咱們能夠刪表重建,可是上線以後可不能這麼搞了。因此數據遷移就很重要了。javascript

所謂的數據遷移原理其實就是將數據複製出來而後再把表刪了從新建表同時把數據再複製進去。java

這裏我用到的ORMSequelize因此下面簡單介紹一下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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索