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

Node.js Sequelize CLI如何从模型创建迁移?,node.js,migration,sequelize.js,Node.js,Migration,Sequelize.js,我有两个模型,一对多 我不知道如何创建迁移文件。每个模型是否都有自己的迁移文件,或者一个迁移文件可以从模型及其之间的关系创建多个表(例如,在rails迁移中) 我看了很多例子,包括Sequelize文档,还有一些模型创建和迁移的原始例子 //User model module.exports = function (sequelize, Sequelize) { var User = sequelize.define('users', { id: {

我有两个模型,一对多

我不知道如何创建迁移文件。每个模型是否都有自己的迁移文件,或者一个迁移文件可以从模型及其之间的关系创建多个表(例如,在rails迁移中)

我看了很多例子,包括Sequelize文档,还有一些模型创建和迁移的原始例子

//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);

加成

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

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()
        ]
    }
};
我需要为我的模型添加迁移文件类方法吗

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

//for User
classMethods: {
    associate: function(models) {
        Model.hasMany(models.orders, (as: 'orders'));
    }
}
//增补2


为了创建新的迁移文件,您需要调用
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'
}
您只需要记住模型中的字段定义和迁移文件中与指定模型/表对应的字段/列定义之间的一致性

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

要显示所有可能的
sequelize cli
命令,只需运行
sequelize help

编辑

类方法(如
associate
)只能出现在模型定义文件中,而不能出现在移植文件中

编辑2

在迁移文件(如
createTable
中使用的函数是异步的,因此不能像在迁移文件中那样简单地按顺序运行它们。您可以通过
.then()
方法链接它们,或者像

return [queryInterface.createTable(...), queryInterface.createTable(...)];

谢谢,我创建了迁移文件,并将其添加到带有附加问题的问题中。我已更新了答案。简而言之,类方法只在模型定义文件中定义,而不是在迁移文件中定义。我做了迁移,得到了控制台消息:==20170319144537-create_users_and_orders:migrating===20170319144537-create_users_and_orders:migrated(0.100s),但在db中我只看到一个“users”表。在
下拉
函数中,您需要将
dropTable('users')
dropTable('orders')
交换。首先您需要删除表
订单
,然后您可以删除
用户
,因为
用户
订单
中引用,所以需要将其作为第二个删除。请尝试
撤消
迁移,然后再次运行迁移,并告知dbAnyway I not get orders表中是否仍然只有一个表。将屏幕添加到问题。