Knex: рд╡рд╛рджреЗ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 16 рдЬреВрди 2014  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: knex/knex

(рдпрд╣ # 312 рдХрд╛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)

рдПрдХ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдЬреИрд╕реЗ:

exports.up = function(knex, Promise) {
  var first = knex.schema.createTable('first', function(table) {
    table.increments('id');
    table.string('name');
  });

  var second = first.then(function() {
    return knex.schema.createTable('second', function(table) {
      table.increments('id');
      table.string('name');
    });
  });

  return Promise.all([first, second]);
};

exports.down = function(knex, Promise) {

};

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдЙрдЯрдкреБрдЯ рджреЗрддрд╛ рд╣реИ:

{ __cid: '__cid1',
  sql: 'create table "first" ("id" serial primary key, "name" varchar(255))',
  bindings: [] }
{ __cid: '__cid2',
  sql: 'create table "first" ("id" serial primary key, "name" varchar(255))',
  bindings: [] }
{ __cid: '__cid3',
  sql: 'create table "second" ("id" serial primary key, "name" varchar(255))',
  bindings: [] }
error: duplicate key value violates unique constraint "pg_type_typname_nsp_index"
    at Connection.parseE (/home/sohum/node_modules/pg/lib/connection.js:526:11)
    at Connection.parseMessage (/home/sohum/node_modules/pg/lib/connection.js:356:17)
    at Socket.<anonymous> (/home/sohum/node_modules/pg/lib/connection.js:105:22)
    at Socket.EventEmitter.emit (events.js:95:17)
    at Socket.<anonymous> (_stream_readable.js:745:14)
    at Socket.EventEmitter.emit (events.js:92:17)
    at emitReadable_ (_stream_readable.js:407:10)
    at emitReadable (_stream_readable.js:403:5)
    at readableAddChunk (_stream_readable.js:165:9)
    at Socket.Readable.push (_stream_readable.js:127:10)

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рддреЛ рдпрд╣рд╛рдБ рднреНрд░рдо рдпрд╣ рд╣реИ рдХрд┐ createTable рдкрджреНрдзрддрд┐ рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ SchemaBuilder рд╡рд╕реНрддреБ рджреЗрддреА рд╣реИ, рдЬреЛ рдХрд┐ "рддрддреНрдХрд╛рд▓реАрди" рд╣реИ, рдЕрд░реНрдерд╛рдд .then рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рд╡реИрдз A + рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рд╡рд╕реНрддреБ рд╕реНрд╡рдпрдВ рдПрдХ рд╡рд╛рджрд╛ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

  return knex.schema.createTable('first', function(table) {
    table.increments('id');
    table.string('name');
  })
  .createTable('second', function(table) {
      table.increments('id');
      table.string('name');
  }).then(function() {
    // all done
  });

рдЬреЛ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдПрдХ рд╣реА рдХрдиреЗрдХреНрд╢рди рдкрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдкрд▓рд╛рдпрди рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдБ Promise.all рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╣реА рдкреВрд░рд╛ рдХрд░реЗрдЧрд╛:

exports.up = function(knex, Promise) {
  return knex.schema.createTable('first', function(table) {
    table.increments('id');
    table.string('name');
  }).then(function() {
    return knex.schema.createTable('second', function(table) {
      table.increments('id');
      table.string('name');
    });
  });
};

рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рдереЗ, рддреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

exports.up = function(knex, Promise) {
  var first = knex.schema.createTable('first', function(table) {
    table.increments('id');
    table.string('name');
  }).then(); // coerce thenable to a promise

  var second = first.then(function() {
    return knex.schema.createTable('second', function(table) {
      table.increments('id');
      table.string('name');
    });
  });

  return Promise.all([first, second]);
};

рдФрд░ рдЪреАрдЬреЗрдВ рдХрд▓реНрдкрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреАред

рд╕рднреА 10 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдкрдХреЛ Promise.all([first, second]); рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА second рд╕реЗ first ред рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдХреЗрд╡рд▓ return first рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдХреЗ рдмрд╛рдж рд╕реЗ рдЕрдкрдиреЗ рджреВрд╕рд░реЗ createTable рдПрдХ рдХреЗ рдЕрдВрджрд░ рд╣реИ then рдЬрд┐рдирдореЗрдВ рд╕реЗ рдмрдВрдж рд╢реНрд░реГрдВрдЦрд▓рд┐рдд рд╣реИ first , рд╡рд╣рд╛рдБ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ Promise.all , рдХреЗ рдмрд╛рдж рд╕реЗ рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ рд╡реИрд╕реЗ рднреА first рдХрд╛ рд╣рд▓ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рд╡рд╛рджрд╛ рдпреБрдХреНрддрд┐ рдХрд╣рддреА рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдПрдХ рд╡рд╛рджрд╛ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрднреА рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ then рд╕рднреА рднрд╡рд┐рд╖реНрдп рдХреЗ рдЖрдХреНрд░рдордгреЛрдВ рдХреЛ рдХреИрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд░ first рдФрд░ second рджреЛрдиреЛрдВ рдкреВрд░реЗ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ Promise.all([first, second]) ~ рдПрдХ рд╕реЗрд╢рди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

return first рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдорд╛рди рд╣реИ - рдЕрд░реНрдерд╛рдд, рдпрд╣ first , first , рдФрд░ second рдЯреЗрдмрд▓ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ _even рдЕрдзрд┐рдХ рдЧрд▓рдд_ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╣рд╛рдБ рд╣реИ рдХрднреА рднреА рдРрд╕рд╛ рдХреЛрдИ рдХреЛрдб рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ first.then рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реЛред

рдЙрдореНрдо рдареАрдХ рд╣реИ рдЬреЛ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред Promise.all рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдереЛрдбрд╝реА рд╡реГрджреНрдзрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ;)

рд▓реЗрдХрд┐рди рд╣рд╛рдБ, рдпрд╣ рдЧрд▓рдд рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реВрдВрдЧрд╛ рдФрд░ @tgriesser рдХреА рдЭрдВрдХрд╛рд░ рддрдХ рдЗрдВрддрдЬрд╛рд░

рд╣рд╛рд╣рд╛, рдореБрдЭреЗ рдЕрдкрдиреЗ рдкреНрд░рд╡рд╛рд╕ рдореЗрдВ рдПрдХ рдЯрд┐рдХ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореВрд▓реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ: рдкреА

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдКрдкрд░ рдПрдХ рдЧрд▓рдд рдмрдпрд╛рди рджрд┐рдпрд╛ - return first рдХреЛ рдЕрднреА рднреА рджреВрд╕рд░реА рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкрд░ .then рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЬреЛ, w / e - рдпрд╣ рдЕрднреА рднреА рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ first , first , second !

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ: рдкрд╣рд▓реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реА рддрд╛рд▓рд┐рдХрд╛ рдХреНрдпреЛрдВ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧреА? рдЪреВрдБрдХрд┐ рдЖрдк then рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╣рд▓реЗ рд╡рд╛рджреЗ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдмрдВрдж рдХрд░рддреЗ рд╣реИрдВ,

рджреВрд╕рд░реА рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рд╣рд╛рдВ, рд▓реЗрдХрд┐рди exports.up рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред Ie, рдпрджрд┐ рдЖрдк exports.up().then рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ first.then рдФрд░ second.then - рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ _is_ first.then !

рдЖрд╣, рддреБрдо рд╡рд╣рд╛рдБ рдЧрд▓рдд рд╕рдордЭрд╛ - рд╣рд╛рдБ, рддреБрдо рдЙрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╣реА рд╣реЛ!

рддреЛ рдпрд╣рд╛рдБ рднреНрд░рдо рдпрд╣ рд╣реИ рдХрд┐ createTable рдкрджреНрдзрддрд┐ рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ SchemaBuilder рд╡рд╕реНрддреБ рджреЗрддреА рд╣реИ, рдЬреЛ рдХрд┐ "рддрддреНрдХрд╛рд▓реАрди" рд╣реИ, рдЕрд░реНрдерд╛рдд .then рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рд╡реИрдз A + рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рд╡рд╕реНрддреБ рд╕реНрд╡рдпрдВ рдПрдХ рд╡рд╛рджрд╛ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

  return knex.schema.createTable('first', function(table) {
    table.increments('id');
    table.string('name');
  })
  .createTable('second', function(table) {
      table.increments('id');
      table.string('name');
  }).then(function() {
    // all done
  });

рдЬреЛ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдПрдХ рд╣реА рдХрдиреЗрдХреНрд╢рди рдкрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдкрд▓рд╛рдпрди рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдБ Promise.all рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╣реА рдкреВрд░рд╛ рдХрд░реЗрдЧрд╛:

exports.up = function(knex, Promise) {
  return knex.schema.createTable('first', function(table) {
    table.increments('id');
    table.string('name');
  }).then(function() {
    return knex.schema.createTable('second', function(table) {
      table.increments('id');
      table.string('name');
    });
  });
};

рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рдереЗ, рддреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

exports.up = function(knex, Promise) {
  var first = knex.schema.createTable('first', function(table) {
    table.increments('id');
    table.string('name');
  }).then(); // coerce thenable to a promise

  var second = first.then(function() {
    return knex.schema.createTable('second', function(table) {
      table.increments('id');
      table.string('name');
    });
  });

  return Promise.all([first, second]);
};

рдФрд░ рдЪреАрдЬреЗрдВ рдХрд▓реНрдкрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреАред

рдареАрдХ рд╣реИ рдХрд┐ рдмрддрд╛рддреЗ рд╣реИрдВред рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ - рд╕реАрдзреЗ рд╕реАрдзреЗ @SohumB рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рднреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЦреЗрдж рд╣реИ

рд╣рд╛рдБ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдирд┐рд░реНрднрд░рддрд╛ рдЧреНрд░рд╛рдл рд╣реИрдВ; рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдиреНрдпреВрдирддрдо рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ рдерд╛! рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@johanneslumpe

sohum<strong i="8">@diurnal</strong> ~ % cat test.js
var Promise = require('bluebird');

function promises() {
  var first = Promise.resolve('wee');
  var second = first.then(function() {
    console.log('delayin');
    return Promise.delay(1000);
  }).then(function() {
    console.log('done!');
  });
  return first;
}

promises().then(function() { console.log('yep, first is finished'); });

sohum<strong i="9">@diurnal</strong> ~ % node test.js
delayin
yep, first is finished
done!
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕