Sequelize v5迁移,模型和关联-如何?

时间:2019-11-22 02:02:38

标签: sequelize.js

尽管要完成一个简单的任务,但文档似乎并没有使人感到困惑。

我有以下模型和迁移-为了使最简单的示例正常工作,我现在减少了属性,但是我确实打算对这些模型/迁移有更多的了解:

用户模型

class User extends Model {
  static init(sequelize) {
    return super.init(
      {
        user_id: {
          type: DataTypes.STRING,
          primaryKey: true,
          allowNull: false,
          autIncrement: false
        },
      {
        sequelize,
        timestamps: true,
        modelName: "User",
        tableName: "Users"
      }
    );
  }
}

module.exports = User;

用户迁移

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Users', {
      user_id: {
        allowNull: false,
        primaryKey: true,
        type: Sequelize.STRING,
      },
      createdAt: {
        allowNull: false,
        defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
        type: Sequelize.DATE,
      },
      updatedAt: {
        allowNull: false,
        defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
        type: Sequelize.DATE,
      },
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Users');
  },
};

工具型号

const { Model, DataTypes } = require('sequelize');

class Tool extends Model {
  static init(sequelize) {
    return super.init(
      {
        tool_id: {
          type: DataTypes.INTEGER,
          primaryKey: true,
          allowNull: false,
          autIncrement: true,
        },
        name: DataTypes.STRING,
      }, {
      sequelize,
      timestamps: true,
      modelName: 'Tool',
      tableName: 'Tools'
    }
    );
  }

  static associate(models) {
    this.belongsToMany(models.User, { as: 'tools', through: 'UserTools' });
  }
}

module.exports = Tool;

工具迁移

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Tools', {
      tool_id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER,
      },
      name: {
        type: Sequelize.STRING,
      },
      createdAt: {
        allowNull: false,
        defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Tools');
  }
};

UserTools模型(缺少fk引用,因为关联应将它们放在模型上?)

class UserTools extends Model {
  static init(sequelize) {
    return super.init(
      {
        quantity: DataTypes.INTEGER,
        uses: {
          type: DataTypes.INTEGER,
          defaultValue: 0,
        },
      }, {
      sequelize,
      timestamps: true,
      modelName: 'UserTools',
      tableName: 'UserTools'
    }
    )
  }
}

UserTools迁移

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    console.log("SEQUELIZE: ", Sequelize);
    return queryInterface.createTable('UserTools', {
      user_id: {
        allowNull: false,
        foreignKey: true,
        autoIncrement: false,
        references: {
          model: 'Users',
          key: 'user_id',
        },
        type: Sequelize.STRING
      },
      tool_id: {
        allowNull: false,
        foreignKey: true,
        autoIncrement: false,
        references: {
          model: 'Tools',
          key: 'tool_id',
        },
        type: Sequelize.INTEGER,
      },
      quantity: {
        type: Sequelize.INTEGER
      },
      uses: {
        type: Sequelize.INTEGER,
        defaultValue: 0,
      },
      createdAt: {
        allowNull: false,
        defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
        type: Sequelize.DATE
      },
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('UserTools');
  },
};

我希望UserTools是一个关联表,其中user_idtool_id是一个组合键,并且我希望在此表上具有其他属性,因此我需要通过模型/表。使用上面的示例,我的用户模型上没有任何关联方法。如果我尝试使用User.hasMany(Tool,{as:'tools',through:'UserTools'}),则会收到一条错误消息,提示hasMany无法使用直通选项。

我可能只是弄乱了简单而明显的东西,但是我很难弄清是什么,很多在线示例要么不完整,要么不使用基于类的模型。

0 个答案:

没有答案