迁移

(文档)[https://github.com/demopark/sequelize-docs-Zh-CN/blob/v5/migrations.md]

migrations

  1. 安装 sequelize-cli

    1. npm install --save-dev sequelize-cli
  2. .sequelizerc 配置文件

  1. 'use strict';
  2. const path = require('path');
  3. module.exports = {
  4. config: path.join(__dirname, 'database/config.json'),
  5. 'migrations-path': path.join(__dirname, 'database/migrations'),
  6. 'seeders-path': path.join(__dirname, 'database/seeders'),
  7. 'models-path': path.join(__dirname, 'app/model'),
  8. };
  1. 初始化 Migrations 配置文件和目录

npx sequelize init:config
npx sequelize init:migrations
npx sequelize init

  1. config, 包含配置文件,它告诉CLI如何连接数据库
  2. models,包含你的项目的所有模型
  3. migrations, 包含所有迁移文件
  4. seeders, 包含所有种子文件
  1. 将其改成我们项目中使用的数据库配置
  1. "development": {
  2. "username": "root",
  3. "password": null,
  4. "database": "egg-sequelize-doc-default", // 数据库
  5. "host": "127.0.0.1", // 地址
  6. "dialect": "mysql" // 数据库类型
  7. },
  1. 此时 sequelize-cli 和相关的配置也都初始化好了,我们可以开始编写项目的第一个 Migration 文件来创建我们的一个 users 表了
    npx sequelize migration:generate —name=init-users

npx sequelize migration:generate —name User —attributes firstName:string,lastName:string,email:string

如果你的数据库还不存在,你可以调用 db:create 命令. 通过正确的访问,它将为你创建该数据库.

  1. 添加字段
  1. 'use strict';
  2. module.exports = {
  3. // 在执行数据库升级时调用的函数,创建 users 表
  4. up: async (queryInterface, Sequelize) => {
  5. const { INTEGER, DATE, STRING } = Sequelize;
  6. await queryInterface.createTable('users', {
  7. id: { type: INTEGER, primaryKey: true, autoIncrement: true },
  8. name: STRING(30),
  9. age: INTEGER,
  10. created_at: DATE,
  11. updated_at: DATE,
  12. });
  13. },
  14. // 在执行数据库降级时调用的函数,删除 users 表
  15. down: async queryInterface => {
  16. await queryInterface.dropTable('users');
  17. },
  18. };
  1. 执行 migrate 进行数据库变更
  1. # 升级数据库
  2. npx sequelize db:migrate
  3. # 如果有问题需要回滚,可以通过 `db:migrate:undo` 回退一个变更
  4. # npx sequelize db:migrate:undo
  5. # 可以通过 `db:migrate:undo:all` 回退到初始状态
  6. # npx sequelize db:migrate:undo:all
  1. 编写model
  1. 'use strict';
  2. module.exports = app => {
  3. const { STRING, INTEGER, DATE } = app.Sequelize;
  4. const User = app.model.define('user', {
  5. id: { type: INTEGER, primaryKey: true, autoIncrement: true },
  6. name: STRING(30),
  7. age: INTEGER,
  8. created_at: DATE,
  9. updated_at: DATE,
  10. });
  11. return User;
  12. };
  1. 访问model
  1. // app/controller/users.js
  2. const Controller = require('egg').Controller;
  3. function toInt(str) {
  4. if (typeof str === 'number') return str;
  5. if (!str) return str;
  6. return parseInt(str, 10) || 0;
  7. }
  8. class UserController extends Controller {
  9. async index() {
  10. const ctx = this.ctx;
  11. const query = { limit: toInt(ctx.query.limit), offset: toInt(ctx.query.offset) };
  12. ctx.body = await ctx.model.User.findAll(query);
  13. }
  14. async show() {
  15. const ctx = this.ctx;
  16. ctx.body = await ctx.model.User.findByPk(toInt(ctx.params.id));
  17. }
  18. async create() {
  19. const ctx = this.ctx;
  20. const { name, age } = ctx.request.body;
  21. const user = await ctx.model.User.create({ name, age });
  22. ctx.status = 201;
  23. ctx.body = user;
  24. }
  25. async update() {
  26. const ctx = this.ctx;
  27. const id = toInt(ctx.params.id);
  28. const user = await ctx.model.User.findByPk(id);
  29. if (!user) {
  30. ctx.status = 404;
  31. return;
  32. }
  33. const { name, age } = ctx.request.body;
  34. await user.update({ name, age });
  35. ctx.body = user;
  36. }
  37. async destroy() {
  38. const ctx = this.ctx;
  39. const id = toInt(ctx.params.id);
  40. const user = await ctx.model.User.findByPk(id);
  41. if (!user) {
  42. ctx.status = 404;
  43. return;
  44. }
  45. await user.destroy();
  46. ctx.status = 200;
  47. }
  48. }
  49. module.exports = UserController;
  1. 创建第一个种子
  1. npx sequelize-cli seed:generate --name managers
  2. # 同上
  3. npx sequelize seed:generate --name managers
  1. 运行种子 撤销种子
  1. # 运行种子
  2. npx sequelize-cli db:seed:all
  3. # 如果你想撤消最近的种子
  4. npx sequelize-cli db:seed:undo
  5. # 如果你想撤消特定的种子
  6. npx sequelize-cli db:seed:undo --seed name-of-seed-as-in-data
  7. # 如果你想撤消所有的种子
  8. npx sequelize-cli db:seed:undo:all

下一个是具有外键的迁移示例. 你可以使用 references 来指定外键:

  1. module.exports = {
  2. up: (queryInterface, Sequelize) => {
  3. return queryInterface.createTable('Person', {
  4. name: Sequelize.STRING,
  5. isBetaMember: {
  6. type: Sequelize.BOOLEAN,
  7. defaultValue: false,
  8. allowNull: false
  9. },
  10. userId: {
  11. type: Sequelize.INTEGER,
  12. references: {
  13. model: {
  14. tableName: 'users',
  15. schema: 'schema'
  16. }
  17. key: 'id'
  18. },
  19. allowNull: false
  20. },
  21. });
  22. },
  23. down: (queryInterface, Sequelize) => {
  24. return queryInterface.dropTable('Person');
  25. }
  26. }

.sequelizerc 文件

这是一个特殊的配置文件. 它允许你指定通常作为参数传递给CLI的各种选项:

env: 在其中运行命令的环境
config: 配置文件的路径
options-path: 带有其他参数的 JSON 文件的路径
migrations-path: migrations 文件夹的路径
seeders-path: seeders 文件夹的路径
models-path: models 文件夹的路径
url: 要使用的数据库连接字符串. 替代使用 —config 文件
debug: 可用时显示各种调试信息

初始化项目

  1. # 创建数据库
  2. npx sequelize db:create
  3. # 创建表
  4. npx sequelize db:migrate
  5. # 创建默认值
  6. npx sequelize db:seed:all

数据回滚

  1. # 如果你想撤消所有的种子
  2. npx sequelize-cli db:seed:undo:all
  3. # 回退到初始状态
  4. npx sequelize db:migrate:undo:all

生成公钥:openssl genrsa -out rsa_private_key.pem 1024
生成私钥: openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

命令 参数

如果没有全局安装可以通过npx 来运行
如果没有npx 可以选择全局安装

  1. npm install -g npx
  1. sequelize db:migrate 运行挂起的迁移
  2. sequelize db:migrate:schema:timestamps:add 更新迁移表以具有时间戳
  3. sequelize db:migrate:status 列出所有迁移的状态
  4. sequelize db:migrate:undo 恢复迁移
  5. sequelize db:migrate:undo:all 恢复运行的所有迁移
  6. sequelize db:seed 运行指定的播种机
  7. sequelize db:seed:undo 从数据库中删除数据
  8. sequelize db:seed:all 运行每个播种机
  9. sequelize db:seed:undo:all 从数据库中删除数据
  10. sequelize db:create 创建配置指定的数据库
  11. sequelize db:drop 删除配置指定的数据库
  12. sequelize init 初始化项目
  13. sequelize init:config 初始化配置
  14. sequelize init:migrations 初始化迁移
  15. sequelize init:models 初始化模型
  16. sequelize init:seeders 初始化播种机
  17. sequelize migration:generate 生成一个新的迁移文件 [别名:migration:create]
  18. sequelize model:generate 生成模型及其迁移 [别名:model:create]
  19. sequelize seed:generate 生成一个新的种子文件 [别名:seed:create]
  20. --version 显示版本号 [boolean]
  21. --help 显示帮助