Sequelize CLI如何从模型创建迁移?

Ser*_*i R 1 migration node.js sequelize.js

我有两个关系一对多的模型.

我不明白如何创建迁移文件.每个模型是否都有自己的迁移文件,或者一个迁移文件可以根据模型和它们之间的关系创建多个表(例如在rails迁移中)?

我看了很多例子,包括Sequelize docs,还有模型创建及其迁移的原始示例.

//User model
module.exports = function (sequelize, Sequelize) {
    var User = sequelize.define('users', {
        id: {
            type: Sequelize.INTEGER,
            primaryKey: true,
            autoIncrement: true,
        },
        email: {
            type: Sequelize.STRING,
            allowNull: false,
            unique: true,
        },
        password: {
            type: Sequelize.STRING,
            allowNull: false,
        },
    });

    return User;
}

//Order model
module.exports = function (sequelize, Sequelize) {
    var Order = sequelize.define('orders', {
        id: {
            type: Sequelize.INTEGER,
            primaryKey: true,
            autoIncrement: true,
        },
        price: {
            type: Sequelize.INTEGER,
            allowNull: false,
        },
        totalPrice: {
            type: Sequelize.INTEGER,
            allowNull: false,
        },
    });

    return Order;
}

//db.js
//Relations
db.orders.belongsTo(db.users);
db.users.hasMany(db.orders);
Run Code Online (Sandbox Code Playgroud)

加成

我为两个模型创建了迁移:

module.exports = {
    up: function (queryInterface, Sequelize, done) {
        return [
        queryInterface.createTable('users', {
            id: {
                type: Sequelize.INTEGER,
                primaryKey: true,
                autoIncrement: true,
            },
            email: {
                type: Sequelize.STRING,
                allowNull: false,
                unique: true,
            },
            password: {
                type: Sequelize.STRING,
                allowNull: false,
            },
        }),
        queryInterface.createTable('orders', {
            id: {
                type: Sequelize.INTEGER,
                primaryKey: true,
                autoIncrement: true,
            },
            price: {
                type: Sequelize.INTEGER,
                allowNull: false,
            },
            totalPrice: {
                type: Sequelize.INTEGER,
                allowNull: false,
            },
            userId: {
                type: Sequelize.INTEGER,
                references: {
                    model: 'users',
                    key: 'id'
                },
                onUpdate: 'CASCADE',
                onDelete: 'CASCADE'
            }
        }),
        done()
        ]
    },

    down: function (queryInterface, Sequelize, done) {
        return [
        queryInterface.dropTable('users'),
        queryInterface.dropTable('orders'),
        done()
        ]
    }
};
Run Code Online (Sandbox Code Playgroud)

我是否需要为我的模型添加到我的迁移文件类方法中?

//for Order
classMethods: {
    associate: function(models) {
        Model.belongsTo(models.users, (as: 'users'));
    }
}

//for User
classMethods: {
    associate: function(models) {
        Model.hasMany(models.orders, (as: 'orders'));
    }
}
Run Code Online (Sandbox Code Playgroud)

//加法2

在此输入图像描述

pio*_*ias 5

要创建新的迁移文件,需要调用sequelize migration:create,在/migrations目录中创建新文件(即默认迁移目录,可以不同).在迁移文件中,您可以使用一堆函数来创建表,更新它们或指定表列等.如果需要,可以在单个迁移文件中创建所有数据库表.模型和迁移文件之间没有直接连接 - 它们彼此独立.同样关注模型/表之间的关系.您需要指定给定表中的给定列引用其他表.

// example column definition inside migration file
// creates a foreign key referencing table 'users'
userId: {
    type: Sequelize.INTEGER,
    references: {
        model: 'users',
        key: 'id'
    },
    onDelete: 'CASCADE'
}
Run Code Online (Sandbox Code Playgroud)

您只需要记住Model中的字段定义与对应于指定模型/表的迁移文件中的字段/列定义之间的一致性.

您还可以使用命令sequelize model:create,同时创建用于定义Sequelize模型的文件,以及负责创建与此模型对应的表的迁移文件.

为了显示所有可能的sequelize-cli命令,只需运行即可sequelize help.

编辑

类方法associate必须仅存在于模型定义文件中,而不是存在于迁移文件中.

编辑2

迁移文件中使用的函数createTable是异步的,因此您不能像在迁移文件中那样简单地运行它们.您可以通过.then()方法链接它们或将它们作为数组返回

return [queryInterface.createTable(...), queryInterface.createTable(...)];
Run Code Online (Sandbox Code Playgroud)