使用Sequelize在单个迁移中创建表并添加索引

Don*_*n P 20 sequelize.js

单次迁移中创建表并在其某些列上添加索引的正确方法是什么?

示例迁移:2012341234-create-todo.js

如何在"author_id"和"title"列上创建索引?

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Todos', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      author_id: {
        type: Sequelize.INTEGER,
        onDelete: 'CASCADE',
        references: {
          model: 'Authors',
          key: 'id',
          as: 'authorId'
        }
      },
      title: {
        type: Sequelize.STRING
      },

      content: {
        type: Sequelize.TEXT
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Todos');
  }
};
Run Code Online (Sandbox Code Playgroud)

Sequelize文档表明将添加如下索引:

queryInterface.addIndex('Todos', ['author_id', 'title']);
Run Code Online (Sandbox Code Playgroud)

这些方法可以被链接吗?"向上"和"向下"只需要返回一个承诺吗?我在文档中没有看到任何关于它的内容.

pio*_*ias 32

是的,方法可以链接.在您的情况下,您只需执行addIndexafter createTable方法

return queryInterface.createTable('Todos', {
    // columns...
}).then(() => queryInterface.addIndex('Todos', ['author_id', 'title']))
.then(() => {
    // perform further operations if needed
});
Run Code Online (Sandbox Code Playgroud)


Dee*_*one 18

如果第二步失败,则可接受的解决方案是有问题的。应该使用每个步骤中的事务来允许回滚,以确保在任何步骤遇到问题时都可以撤消插入或更新的所有迁移步骤。例如:

module.exports = {
 up: async (queryIntereface) => {
    const transaction = await queryInterface.sequelize.transaction();

    try {
      await queryInterface.createTable('Todos', {
        // columns...
      }, { transaction });
      await queryInterface.addIndex('Todos', ['author_id', 'title'], { transaction }));


      await transaction.commit();
    } catch (err) {
      await transaction.rollback();
      throw err;
    }
  },

  down: async (queryInterface) {

    etc...
Run Code Online (Sandbox Code Playgroud)

参考

  • 事务在某些数据库中没有帮助,例如 MySQL,其中 CREATE 语句或 ALTER TABLE 执行隐式提交并且无法回滚。https://dev.mysql.com/doc/refman/8.0/en/cannot-roll-back.html (5认同)

Luc*_*edo 9

我没有参与交易。我刚刚创建了表并一步添加了索引(唯一索引,这就是我需要的):

    'use strict';
    const { DataTypes } = require('sequelize');

    module.exports = {
      up: async (queryInterface, Sequelize) => {
        return await queryInterface.createTable('exampleTable', {
          id: {
            type: DataTypes.INTEGER,
            primaryKey: true,
            autoIncrement: true
          },
          userId: {
              type: DataTypes.INTEGER,
              allowNull: false,
              references: {
                  model: 'user',
                  key: 'id'
              }
          },
          classId: {
              type: DataTypes.INTEGER,
              allowNull: false,
              references: {
                  model: 'class',
                  key: 'id'
              }
          },
      },
      {
          uniqueKeys: {
            unique_tag: {
                customIndex: true,
                fields: ["userId", "classId"]
            }
          }
        });
      },

      down: async (queryInterface, Sequelize) => {
        return await queryInterface.dropTable('exampleTable');
      }
    };
Run Code Online (Sandbox Code Playgroud)


Roh*_*rte 5

添加索引的最简单方法

    'use strict';
    
    module.exports = {
      up: (queryInterface, Sequelize) => {
        return queryInterface.addIndex('reports', ['client_id'])
          .then(() => {
            return queryInterface.addIndex('reports', ['report_name'])
          })
          .then(() => {
            return queryInterface.addIndex('reports', ['report_date'])
          })
      },
    
      down: (queryInterface, Sequelize) => {
        return queryInterface.removeIndex('reports', ['client_id'])
        .then(() => {
          return queryInterface.removeIndex('reports', ['report_name'])
        })
        .then(() => {
          return queryInterface.removeIndex('reports', ['report_date'])
        })
      }
    };
Run Code Online (Sandbox Code Playgroud)