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

Javascript 需要帮助设置节点/Knex的迁移吗,javascript,node.js,knex.js,Javascript,Node.js,Knex.js,我刚刚使用knex.js创建了一个节点应用程序,我需要关于如何基于此sql转储创建迁移的帮助。如果有人能帮助我,我会非常高兴 我不要求全部,我只是需要一些关于如何开始的帮助。我仍然非常不擅长javascript,我觉得自己被卡住了:( 我是这样开始的: exports.up = function(knex, Promise) { return Promise.all([ knex.schema.createTable('role', function(table){

我刚刚使用knex.js创建了一个节点应用程序,我需要关于如何基于此sql转储创建迁移的帮助。如果有人能帮助我,我会非常高兴

我不要求全部,我只是需要一些关于如何开始的帮助。我仍然非常不擅长javascript,我觉得自己被卡住了:(

我是这样开始的:

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();
      })
    ])
  };

<首先,让我们看看角色表。首先,我们有一个自动增加的主键“ID”。因此,相应的KNEX行将是:

t.increments('id').primary().unsigned();
t.string('authority', 255).unique();
然后,我们有了权限。这是一个唯一的varchar,对应于一个knex字符串。等效的行是:

t.increments('id').primary().unsigned();
t.string('authority', 255).unique();
好的,现在转到users表。我们和以前一样有一个主的、唯一的、自动递增的ID,所以我们可以从上面复制和粘贴ID行。然后,我们有用户名和密码字段,它们不是null 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.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 = function(knex, Promise) {
  return Promise.all([
    knex.schema.dropTable("role");
    knex.schema.dropTable("user");
    knex.schema.dropTable("user_role");
  ]);
};
当我们把它们放在一起时,我们会得到:

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();
    })
  ])
};
上述代码将创建所有表、列等,但不会插入值。我们需要为此创建一个种子文件。我们可以创建一个种子文件来插入值,如下所示:

table.integer('user_id').unsigned().references('user.id');
table.integer('role_id').unsigned().references('role.id');
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 = function(knex, Promise) {
  return Promise.all([
    knex.schema.dropTable("role");
    knex.schema.dropTable("user");
    knex.schema.dropTable("user_role");
  ]);
};
您需要按照上面的格式为每个表创建一个新的种子文件。我相信这个答案应该涵盖所有内容,但是如果您有任何问题,请告诉我

后退 要回滚,我们需要将exports.down方法添加到迁移中。它应该如下所示:

table.integer('user_id').unsigned().references('user.id');
table.integer('role_id').unsigned().references('role.id');
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 = function(knex, Promise) {
  return Promise.all([
    knex.schema.dropTable("role");
    knex.schema.dropTable("user");
    knex.schema.dropTable("user_role");
  ]);
};

<首先,让我们看看角色表。首先,我们有一个自动增加的主键“ID”。因此,相应的KNEX行将是:

t.increments('id').primary().unsigned();
t.string('authority', 255).unique();
然后,我们有了权限。这是一个唯一的varchar,对应于一个knex字符串。等效的行是:

t.increments('id').primary().unsigned();
t.string('authority', 255).unique();
好的,现在转到users表。我们和以前一样有一个主的、唯一的、自动递增的ID,所以我们可以从上面复制和粘贴ID行。然后,我们有用户名和密码字段,它们不是null 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.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 = function(knex, Promise) {
  return Promise.all([
    knex.schema.dropTable("role");
    knex.schema.dropTable("user");
    knex.schema.dropTable("user_role");
  ]);
};
当我们把它们放在一起时,我们会得到:

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();
    })
  ])
};
上述代码将创建所有表、列等,但不会插入值。我们需要为此创建一个种子文件。我们可以创建一个种子文件来插入值,如下所示:

table.integer('user_id').unsigned().references('user.id');
table.integer('role_id').unsigned().references('role.id');
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 = function(knex, Promise) {
  return Promise.all([
    knex.schema.dropTable("role");
    knex.schema.dropTable("user");
    knex.schema.dropTable("user_role");
  ]);
};
您需要按照上面的格式为每个表创建一个新的种子文件。我相信这个答案应该涵盖所有内容,但是如果您有任何问题,请告诉我

后退 要回滚,我们需要将exports.down方法添加到迁移中。它应该如下所示:

table.integer('user_id').unsigned().references('user.id');
table.integer('role_id').unsigned().references('role.id');
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 = function(knex, Promise) {
  return Promise.all([
    knex.schema.dropTable("role");
    knex.schema.dropTable("user");
    knex.schema.dropTable("user_role");
  ]);
};

哦,我的上帝,你是一个善良的人!!我永远都很高兴,我会尽快尝试设置它。突然出现了一个问题:种子文件,它应该放在哪里?如果我运行knex migrate:latest,knex会自动发现吗?很高兴我能帮上忙!通过运行
knex seed:make seed\u name
创建种子文件。然后,要运行种子,你需要要运行
knex seed:run
从您的项目目录。再次您好@Ryan Z我尝试将其部署到我的集群,结果是:失败,错误为:alter table user_role添加约束user_role_user_id_外键(user_id)引用users(id)-ER\u CANNOT\u ADD\u FOREIGN:CANNOT ADD\u FOREIGN:CANNOT ADD\u FOREIGN:CANNOT ADD\u FOREIGN:CANNOT ADD FOREIGN key constraints有两个问题:不是Promise,而是Promise.All,我应该用doe one Promise with.then()?第二个问题,我尝试回滚,它说:已经在基本迁移中了(如何回滚第一次迁移?)@Codehiker我相信您遇到的错误是由于字符集不匹配造成的。请检查您的群集,查看所有ID列以及user\u ID和role\u ID列的字符集。要回滚迁移,您需要在knex迁移中添加一个
exports.down
。我会在我的回答中添加这个。哦,我的上帝,您是一个善良的人!!我真是太棒了,我会尽快设置它。突然出现一个问题:种子文件,它应该放在哪里?如果我运行knex migrate:latest,knex会自动发现吗?很高兴我能帮忙!通过运行
knex seed:make seed\u name
创建种子文件。然后,要运行种子,您需要运行
knex seed:run
来自您的项目目录。再次您好@Ryan Z我尝试将其部署到我的集群,结果:失败,错误:alter table user_role添加约束user_role_user_id_外键(user_id)引用用户(id)-ER\u CANNOT\u ADD\u FOREIGN:CANNOT ADD\u FOREIGN:CANNOT ADD\u FOREIGN:CANNOT ADD\u FOREIGN:CANNOT ADD FOREIGN key constraints有两个问题:不是Promise,而是Promise.All,我应该用doe one Promise with.then()?第二个问题,我尝试回滚,它说:已经在基本迁移中了(如何回滚第一次迁移?)@Codehiker我相信您遇到的错误是由于字符集不匹配造成的。请检查您的群集,查看所有ID列以及user\u ID和role\u ID列的字符集。若要回滚迁移,您需要在knex迁移中添加一个
exports.down
。我将在回答中添加这一点。