需要帮助设置节点/ Knex的迁移

时间:2018-07-11 17:42:18

标签: javascript node.js knex.js

我刚刚使用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();
      })
    ])
  };

1 个答案:

答案 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");
  ]);
};