我刚刚使用knex.js创建了一个节点应用程序,我需要有关如何基于此sql dump创建迁移的帮助。如果有人可以帮助我,并且拥有Knex的经验,那将非常高兴。
我并不需要全部,我只需要一些有关入门的帮助。我对JavaScript还是很不好,并且感觉卡住了:(
--
-- Table structure for table `role`
--
DROP TABLE IF EXISTS `role`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `role` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`authority` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `authority` (`authority`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `role`
--
LOCK TABLES `role` WRITE;
/*!40000 ALTER TABLE `role` DISABLE KEYS */;
INSERT INTO `role` VALUES (1,'ROLE_ADMIN'),(2,'ROLE_USER');
/*!40000 ALTER TABLE `role` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `user`
--
DROP TABLE IF EXISTS `user`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`password` varchar(255) NOT NULL,
`username` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `user`
--
LOCK TABLES `user` WRITE;
/*!40000 ALTER TABLE `user` DISABLE KEYS */;
INSERT INTO `user` VALUES (1,'$2a$10$BCYu4wAXWMDXpjnqb9PdSeNi2lUtqRCHvUYv6oWxaOKjEgiJN4Sz2','Admin'),(2,'$2a$10$Pv8Y8BDxeiSbg6yb/CMdrOD0z2Z3FZb3R/DfwW2zGXIEFvAbyQp7y','Rob7');
/*!40000 ALTER TABLE `user` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `user_role`
--
DROP TABLE IF EXISTS `user_role`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `user_role` (
`role_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`role_id`,`user_id`),
KEY `role_id` (`role_id`),
KEY `user_id` (`user_id`),
CONSTRAINT `user_role_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`),
CONSTRAINT `user_role_ibfk_2` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `user_role`
--
LOCK TABLES `user_role` WRITE;
/*!40000 ALTER TABLE `user_role` DISABLE KEYS */;
INSERT INTO `user_role` VALUES (1,1),(2,2);
/*!40000 ALTER TABLE `user_role` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2016-03-08 12:00:23
这是我的开始方式:
exports.up = function(knex, Promise) {
return Promise.all([
knex.schema.createTable('role', function(table){
table.string('username');
table.string('password');
table.timestamps();
}),
knex.schema.createTable('user', function(table){
table.string('username');
table.string('password');
table.timestamps();
}),
knex.schema.createTable('user_role', function(table){
table.string('username');
table.string('password');
table.timestamps();
})
])
};
答案 0 :(得分:2)
好的,所以首先让我们看一下角色表。我们首先要了解的是自动递增的主键“ id”。因此,对应的knex行应为:
t.increments('id').primary().unsigned();
然后,我们拥有权限。这是唯一的varchar,对应于knex字符串。等效行如下:
t.string('authority', 255).unique();
好,现在转到用户表。和以前一样,我们有一个主要的,唯一的,自动递增的ID,因此我们可以从上方复制和粘贴ID行。然后,我们有用户名和密码字段,它们是NOTNULL varchars max 255,并且用户名是唯一的。我们可以使用以下knex线表示这一点:
t.string('username', 255).notNull().unique();
t.string('password', 255).notNull();
现在,我们只需要为user_role表行即可。首先,我们需要像以前一样添加一个ID列。然后,我们可以像这样添加外键列:
table.integer('user_id').unsigned().references('user.id');
table.integer('role_id').unsigned().references('role.id');
当我们将它们放在一起时,我们将得到:
exports.up = function(knex, Promise) {
return knex.schema.createTable('role', function(table){
table.increments('id').primary().unsigned();
table.string('authority', 255).unique();
table.timestamps();
}).createTable('user', function(table){
table.increments('id').primary().unsigned();
table.string('username', 255).notNull().unique();
table.string('password', 255).notNull();
table.timestamps();
}).createTable('user_role', function(table){
table.increments('id').unsigned().primary();
table.integer('user_id').unsigned().references('user.id');
table.integer('role_id').unsigned().references('role.id');
table.timestamps();
})
])
};
上面的代码将创建所有表,列等,但是不会插入值。我们将需要为此创建一个种子文件。我们可以创建一个种子文件来插入值,如下所示:
exports.seed = function(knex, Promise) {
// Deletes ALL existing entries
return knex('users').del()
.then(function () {
// Inserts seed entries
return knex('users').insert([
{
id: 1,
username: "Admin",
password: "$2a$10$BCYu4wAXWMDXpjnqb9PdSeNi2lUtqRCHvUYv6oWxaOKjEgiJN4Sz2"
},
{
id: 2,
username: "Rob7",
password: "$2a$10$Pv8Y8BDxeiSbg6yb/CMdrOD0z2Z3FZb3R/DfwW2zGXIEFvAbyQp7y"
}
]);
});
};
您将要按照上述格式为每个表创建一个新的种子文件。我相信这个答案应该可以解决所有问题,但是如果您有任何疑问,请告诉我!
要回滚,我们需要在迁移中添加exports.down方法。它应该看起来像这样:
exports.down = function(knex, Promise) {
return Promise.all([
knex.schema.dropTable("role");
knex.schema.dropTable("user");
knex.schema.dropTable("user_role");
]);
};