Knex: μ™Έλž˜ ν‚€ μ œμ•½ 쑰건을 μΆ”κ°€ν•  수 μ—†μŒ

에 λ§Œλ“  2014λ…„ 04μ›” 17일  Β·  11μ½”λ©˜νŠΈ  Β·  좜처: knex/knex

μ•„λž˜ μ½”λ“œλ‘œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μ‹€ν–‰ν•˜λ©΄ "μ™Έλž˜ ν‚€ μ œμ•½ 쑰건을 μΆ”κ°€ν•  수 μ—†μŠ΅λ‹ˆλ‹€"λΌλŠ” λ©”μ‹œμ§€κ°€ λ‚˜νƒ€λ‚©λ‹ˆλ‹€. λˆ„κ΅¬λ“ μ§€ μ˜¬λ°”λ₯Έ λ°©ν–₯으둜 λ‚˜λ₯Ό κ°€λ¦¬μΌœ μ£Όλ‚˜μš”?

exports.up = function(knex, Promise) {
    var defer=Promise.defer();

    knex.schema.createTable('User',function(table){

        //--Create User Table
        table.increments('UserId').primary();
        table.string('username');
        table.string('email',60);
        table.string('password',65);
        table.timestamps();

    })
    .then(function(){
        return knex.schema.createTable('Comment',function(table){

            //--Create Comment Table
            table.increments('CommentId').primary();
            table.string('Comment');

            table.integer('UserId',11).inTable('User').references('UserId');

        });     
    })
    .then(function(){

            defer.resolve();
    });


    return defer.promise;

};

exports.down = function(knex, Promise) {

};  

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이 글을 μ½λŠ” 미래의 μ‚¬λžŒλ“€μ—κ²Œ 참고둜:
table.integer('UserId',11).unsigned().inTable('User').references('UserId');
μ§€κΈˆμ΄λ‹€
table.integer('UserId',11).unsigned().references('UserId').inTable('User');

λͺ¨λ“  11 λŒ“κΈ€

mysql을 μ‚¬μš©ν•˜κ³  μžˆλ‹€κ³  κ°€μ •ν•˜λ©΄ UserId κ°€ .unsigned() μž„μ„ 지정해야 ν•©λ‹ˆλ‹€.

λ˜ν•œ κ±°κΈ°μ—μ„œ μ—°κΈ°ν•  ν•„μš”κ°€ μ—†μ–΄μ•Ό ν•©λ‹ˆλ‹€. knex.schema.createTable λ₯Ό λ°˜ν™˜ν•˜λ©΄ λ©λ‹ˆλ‹€.

exports.up = function(knex, Promise) {
  return knex.schema.createTable('User',function (table){ 
      table.increments('UserId').primary();
      table.string('username');
      table.string('email',60);
      table.string('password',65);
      table.timestamps();
  })
  .then(function () {
    return knex.schema.createTable('Comment',function(table){
      table.increments('CommentId').primary();
      table.string('Comment');
      table.integer('UserId',11).unsigned().inTable('User').references('UserId');
    });     
  });
};

Promise.defer λŠ” 거의 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

와. 둝 μ—¬λŸ¬λΆ„!! μ™„λ²½ν•˜κ²Œ μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€. λΉ λ₯Έ λ‹΅λ³€κ³Ό κΉ”λ”ν•œ β€‹β€‹μ½”λ“œ 팁 κ°μ‚¬ν•©λ‹ˆλ‹€ :)

λ§žμ•„μš”! 데이터/pk ν•„λ“œμ™€ fk μ°Έμ‘°λ₯Ό 두 개의 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μœΌλ‘œ λΆ„ν• ν•˜λŠ” 것이 더 μ‰¬μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€. λŒ€μ•ˆμ€ μ—¬κΈ°μ—μ„œ μˆ˜ν–‰ν•œ μž‘μ—…μ΄μ§€λ§Œ λ‘€λ°±μ—μ„œλ„ μˆœμ„œλ₯Ό 확인해야 함을 λͺ…μ‹¬ν•˜μ‹­μ‹œμ˜€.

곧 μΆœμ‹œλ  λ²„μ „μ—μ„œλŠ” λͺ¨λ“  μŠ€ν‚€λ§ˆ ν˜ΈμΆœμ„ μ—°κ²°ν•  수 있으며 μˆœμ„œλŒ€λ‘œ μ‹€ν–‰λ˜λ„λ‘ 보μž₯λ©λ‹ˆλ‹€.

exports.up = function(knex, Promise) {
  return knex.schema.createTable('User', function(table){ 
      table.increments('UserId').primary();
      table.string('username');
      table.string('email',60);
      table.string('password',65);
      table.timestamps();
  }).createTable('Comment',function(table){
      table.increments('CommentId').primary();
      table.string('Comment');
      table.integer('UserId',11).unsigned().inTable('User').references('UserId');  
  });
};

μ•„λž˜λ‘œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜:

exports.down = function(knex, Promise) {
  return knex.schema.dropTable('Comment').dropTable('User');
};

이 글을 μ½λŠ” 미래의 μ‚¬λžŒλ“€μ—κ²Œ 참고둜:
table.integer('UserId',11).unsigned().inTable('User').references('UserId');
μ§€κΈˆμ΄λ‹€
table.integer('UserId',11).unsigned().references('UserId').inTable('User');

@batman κ°μ‚¬ν•©λ‹ˆλ‹€!

notNullable()에 였λ₯˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. λ‚΄ μ™Έλž˜ ν‚€λŠ” 항상 nullμž…λ‹ˆλ‹€.
예 1:) table.integer('restaurant_id').unsigned().references('id').inTable('Restaurants');
μ™Έλž˜ ν‚€('restaurant_id")κ°€ 'Restaurants' ν…Œμ΄λΈ”μ˜ 'id'와 μΌμΉ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‹€μŒμ„ μ‚¬μš©ν•˜λ €κ³  ν•  λ•Œ λ‹¨μˆœνžˆ nullμž…λ‹ˆλ‹€.
EX2: ) table.integer('restaurant_id').unsigned().notNullable().references('id').inTable('Restaurants');
였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€(μ™Έλž˜ ν‚€ μ œμ•½ 쑰건을 μΆ”κ°€ν•  수 μ—†μŒ).

μ™Έλž˜ ν‚€κ°€ λ¬Έμžμ—΄μ΄μ§€λ§Œ κΈ°λ³Έ ν‚€('id)λ₯Ό μ°Έμ‘°ν•˜λŠ” μ •μˆ˜κ°€ μžˆλŠ” 경우 이 μ–‘μ‹μ˜ μ™Έλž˜ ν‚€ 생성이 μž‘λ™ν•˜λŠ” 것을 λ³΄μ•˜μŠ΅λ‹ˆλ‹€. λΆ€λͺ¨μ˜ Primary key('id')κ°€ μ •μˆ˜ μœ ν˜•μ΄ μ•„λ‹ˆκ³  κΈ°λ³Έ μœ ν˜•μ΄κΈ° λ•Œλ¬Έμž…λ‹ˆκΉŒ?
table.increments('id').primary();

μ™Έλž˜ ν‚€κ°€ λ¬Έμžμ—΄ μœ ν˜•μΌ λ•Œ μž‘λ™ν•˜λŠ” 것을 λ³΄μ•˜μ§€λ§Œ λ‹€λ₯Έ ν…Œμ΄λΈ”μ˜ κΈ°λ³Έ ν‚€('id')에 λŒ€ν•œ μ •μˆ˜ μœ ν˜• μ°Έμ‘°κ°€ 있으면 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

EX1)을 μ‚¬μš©ν•  λ•Œ λͺ¨λ“  것이 μž‘λ™ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ μ™Έλž˜ ν‚€κ°€ μžλ™μœΌλ‘œ μ¦κ°€ν•˜μ§€ μ•Šκ³  전체 μ‹œκ°„ λ™μ•ˆ λ‹¨μˆœνžˆ nullμž…λ‹ˆλ‹€. λ˜ν•œ λͺ¨λΈ κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ μˆ˜λ™μœΌλ‘œ μ¦κ°€μ‹œν‚¬ 수 μ—†μŠ΅λ‹ˆλ‹€. 이 λ¬Έμ œκ°€ μ–΄λ”˜κ°€μ—μ„œ ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆκΉŒ?

감사 ν•΄μš”,

μ—…λ°μ΄νŠΈ:
μ•Œμ•„λ‚΄μ‹­μ‹œμ˜€. μ™Έλž˜ ν‚€λ‘œ λ§Œλ“  κ³³μ—μ„œ λ³„λ„μ˜ 쀄에 μ •μˆ˜ 열을 μΆ”κ°€ν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.

table.integer('restaurant_id').unsigned();
          table.integer('location_id').unsigned();
          table.foreign('restaurant_id').references('Restaurants.id');
          table.foreign('location_id').references('Locations.id');

λ¬Έμ„œμ—μ„œ MySQLμ—μ„œ μ™Έλž˜ ν‚€λ₯Ό μ •μ˜ν•  λ•Œ .unsigned() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€λŠ” 점을 λͺ…ν™•νžˆ ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 이것을 Objection.js와 ν•¨κ»˜ μ‚¬μš©ν•΄ λ³΄μ•˜κ³  μ²˜μŒμ— μ‹œμž‘ν–ˆμ„ λ•Œ 였λ₯˜κ°€ λ°œμƒν–ˆκΈ° λ•Œλ¬Έμ— 거의 ν¬κΈ°ν–ˆμŠ΅λ‹ˆλ‹€. 두 ν”„λ ˆμž„ μ›Œν¬ λͺ¨λ‘ 버그가 μžˆλ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

두 ν”„λ ˆμž„ μ›Œν¬ λͺ¨λ‘ 버그가 μžˆλ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

@Juanpam 은 μ‚¬μš©ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. κ·Έλž˜λ„ PR은 ν™˜μ˜ν•©λ‹ˆλ‹€. ν–‰μš΄μ„ λΉ•λ‹ˆλ‹€ :)

@elhigu λˆ„κ΅¬μ˜ 기뢄을 μƒν•˜κ²Œ ν•  생각은 μ•„λ‹ˆμ—ˆμ–΄μš”! μ‹€μ œλ‘œ ν”„λ ˆμž„μ›Œν¬ πŸ˜„λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ‚˜μ™€ 같은 μ΄ˆλ³΄μžμ—κ²ŒλŠ” 관계가 ORM 및 쿼리 λΉŒλ”μ—μ„œ 일반적으둜 μ‚¬μš©λ˜λŠ” κΈ°λŠ₯이기 λ•Œλ¬Έμ— 일반적인 문제일 수 μžˆλ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ MySQL은 일반적인 RDBMSμž…λ‹ˆλ‹€.

μ§€κΈˆμ€ 홍보λ₯Ό ν•  수 μ—†μ§€λ§Œ 관심이 μžˆλŠ” 뢄이 κ³„μ‹œλ‹€λ©΄ μ™Έλž˜ ν‚€λ₯Ό μƒμ„±ν•˜λ©΄μ„œ XAMPP MySQL을 μ‚¬μš©ν•˜λ €κ³  ν–ˆμŠ΅λ‹ˆλ‹€. .primary() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  λ•Œ μƒμ„±λœ ν•„λ“œ μœ ν˜•μ€ INT(11) unsigned이고 .integer()λ₯Ό μ‚¬μš©ν•˜μ—¬ μ°Έμ‘° ν•„λ“œλ₯Ό 생성할 λ•Œ κ²°κ³Ό ν•„λ“œ μœ ν˜•μ€ INT(11) μ„œλͺ…λ˜μ–΄ μ™Έλž˜ ν‚€ 생성이 μ‹€νŒ¨ν•©λ‹ˆλ‹€. @tgriesser μˆ˜μ •μ€ ν›Œλ₯­ν•˜κ²Œ μž‘λ™ν•˜μ§€λ§Œ λ¬Έμ„œμ—μ„œ 이와 같은 일반적인 μˆ˜μ •/문제λ₯Ό 찾을 수 μžˆλ‹€λ©΄ 훨씬 더 쒋을 κ²ƒμž…λ‹ˆλ‹€.

μ–΄μ¨Œλ“  ν›Œλ₯­ν•œ μž‘ν’ˆμž…λ‹ˆλ‹€!

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰