Sequelize ORM 现有表如何使用
一、 在mysql中创建一个表 或者随便找一个现有的表
已经有了一张叫做xw_posts的表。表里的字段非常简单,大家可以自己建一下
CREATE TABLE `xw_posts` (`id` int unsigned NOT NULL AUTO_INCREMENT,`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`category_id` int DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;INSERT INTO `xw_posts` (`id`, `name`, `category_id`)
VALUES(1,'天生我材必有用',1),(2,'一天能吃三斤肉',2);
这张表的命名显然是不符合Sequelize规范的。
里面关联分类表的字段是下划线命名,也不符合命名规范。
而且里面还缺少createdAt和updatedAt时间字段。
二、项目中使用创建一个迁移模型生成模板,生成模型的时候,同时也会生成迁移文件。但是我们现在已经有数据表了,不需要再去建表了,所以将迁移文件直接删掉
sequelize model:generate --name Post --attributes category_id:integer,name:string
三、更改模板
1、模型的名字,我们叫做Post。这明显和数据表对不上,但是没关系,不要紧。增加tableName
,指定好模型对应的表名即可。
Post.init({category_id: DataTypes.INTEGER,name: DataTypes.STRING
}, {sequelize,modelName: 'Post',tableName: 'xw_posts', // 指定表名
});
2、另外我们这张表,没有时间字段,不需要createdAt和updatedAt,继续增加配置
Post.init({category_id: DataTypes.INTEGER,name: DataTypes.STRING
}, {sequelize,modelName: 'Post',tableName: 'xw_posts', // 指定表名timestamps: false // 不需要时间
});
3、设置关联外键
我们的Post模型,它与是属于分类的。但是关联字段叫做category_id(默认关联字段为:post_id)
,明显也不符合默认关联字段的命名。没有关系,定义一个一对多关联,只需要用foreignKey定义一下,关联的字段叫什么名字就可以了。
static associate(models) {// define association heremodels.Post.belongsTo(models.Category, { foreignKey: 'category_id', as: 'category' });
}
四、验证
到这里为止,模型就全部改造完成了。我们添加个路由测试下,新建routes/posts.js