Knex: μ—¬λŸ¬ PKλ₯Ό λ§Œλ“€ 수 μ—†μŠ΅λ‹ˆλ‹€ (.primary와 .increments ν˜Όν•©).

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

λ‹€μŒ MySQL 덀프λ₯Ό 기반으둜 ν…Œμ΄λΈ”μ„ λ§Œλ“€κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

CREATE TABLE `my_table` (
  `cmdId` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `deviceId` char(16) NOT NULL,
  `fnNumber` int(10) unsigned DEFAULT NULL,
  `chNumber` int(10) unsigned DEFAULT NULL,
  `cmd` varchar(50) DEFAULT NULL,
  `cmdDate` datetime DEFAULT NULL,
  `delivered` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`cmdId`,`deviceId`),
  KEY `deviceId` (`deviceId`),
  CONSTRAINT `tblcommands_ibfk_1` FOREIGN KEY (`deviceId`) REFERENCES `second_table` (`deviceId`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

λ‚΄ knexλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

knex.schema.createTable('my_table', function(t) {
    t.primary(['cmdId', 'deviceId']);
    t.increments('cmdId');
    t.string('deviceId', 16).notNullable().references('second_table.deviceId');
    t.integer('fnNumber').unsigned();
    t.integer('chNumber').unsigned();
    t.string('cmd96', 50);
    t.dateTime('cmdDate');
    t.boolean('delivered');
});

κ·ΈλŸ¬λ‚˜ κΈ°λ³Έ 킀에 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

Error: Multiple primary key defined

increments λ©”μ„œλ“œλŠ” 이미 PKλ₯Ό μƒμ„±ν•˜κ³  primary λ©”μ„œλ“œλŠ” 였λ₯˜λ₯Ό μΌμœΌν‚€λŠ” λ‹€λ₯Έ ν•˜λ‚˜λ₯Ό μƒμ„±ν•œλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.

이 ν˜•μ‹μ˜ ν…Œμ΄λΈ”μ„ 얻을 수 μžˆμŠ΅λ‹ˆκΉŒ?

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

λ˜λŠ” λ‹€μŒμ„ μ‚¬μš©ν•˜μ—¬ μžλ™ 증가 열을 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

table.specificType('myid','serial');

(Postgresqlμ—λ§Œ ν•΄λ‹Ή)

ν•˜μ§€λ§Œ table.increments() λŠ” table.increments().primary() μˆ˜λ™μœΌλ‘œ μ§€μ •ν•˜λŠ” κ²½μš°μ—λ§Œ PKλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

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

μ•„λ‹ˆμš”,ν•˜μ§€λ§Œ κ·Έλž˜μ•Όν•©λ‹ˆλ‹€. 이것에 λŒ€ν•΄ 쑰사해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

https://github.com/tgriesser/knex/blob/master/lib/dialects/mysql/schema/column.js#L30 에 λ”°λ₯΄λ©΄

ColumnCompiler_MySQL.prototype.increments = 'int unsigned not null auto_increment primary key';

λ”°λΌμ„œ .increments() PKλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. λ„ˆλ¬΄ κ°•ν•œ 행동 μ•„λ‹Œκ°€μš”? PK없이 AUTO_INCREMENT 열을 μƒμ„±ν•˜λŠ” 것이 더 쒋을 것이라고 μƒκ°ν•©λ‹ˆλ‹€.

int unsigned not null auto_increment

PKλ₯Ό μƒμ„±ν•˜λ €λ©΄ .primary() λ₯Ό ν˜ΈμΆœν•΄μ•Όν•©λ‹ˆλ‹€.

table.increments('id').primary();

AUTO_INCREMENT μ—΄λ‘œ λ§Žμ€ PKλ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

μž‘μ—…μš©μœΌλ‘œ μ§€κΈˆ μ‚¬μš©ν•©λ‹ˆλ‹€.

table.primary(['cmdId', 'deviceId']);
table.integer('cmdId').notNullable();
table.string('deviceId', 16).notNullable().references('second_table.deviceId');

그리고 then μ½œλ°±μ—μ„œ :

knex.schema.raw('ALTER TABLE my_table MODIFY cmdId INT UNSIGNED AUTO_INCREMENT');

λΉ„μŠ·ν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. .increments() 을 (λ₯Ό) κΈ°λ³Έ 킀없이 μ‚¬μš©ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. 제 κ²½μš°μ—λŠ” μ„±λŠ₯μƒμ˜ μ΄μœ μž…λ‹ˆλ‹€. μΈλ±μŠ€κ°€μ—†λŠ” ν…Œμ΄λΈ” (κΈ°λ³Έ ν‚€κ°€ μ—†μŒ)을 λ§Œλ“€κ³  λ§Žμ€ 행을 μ‚½μž… ν•œ λ‹€μŒ μžλ™ 증가 열에 인덱슀λ₯Ό μΆ”κ°€ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. 이것은 μ„±λŠ₯이 더 λ›°μ–΄λ‚˜λ©° μ‹€μ œλ‘œ Postgres λ¬Έμ„œ (http://www.postgresql.org/docs/9.4/static/populate.html#POPULATE-RM-INDEXES μ°Έμ‘°)μ—μ„œ ꢌμž₯ν•˜μ§€λ§Œ ν˜„μž¬λŠ” λΆˆκ°€λŠ₯ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€. knex.

λ‚˜λŠ” λ˜ν•œ λΉ„μŠ·ν•œ λ¬Έμ œκ°€ λ°œμƒν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 ν…Œμ΄λΈ”μ„ λ§Œλ“€ 수 μ—†μŠ΅λ‹ˆλ‹€.

knex.schema.createTable("numeric_table", function (table) {
    table.integer("integer_key").primary;

   // Both increments & bigIncrements tries to create primary key.
    table.increments("increment_key");
    table.bigIncrements("big_increment_key");
});

μ—¬κΈ°μ„œ 같은 문제 .increments ()λŠ” μˆ˜λ™μœΌλ‘œ μ§€μ •ν•˜λ”λΌλ„ κΈ°λ³Έ ν‚€λ₯Ό μ •μ˜ν•˜λ €κ³ ν•©λ‹ˆλ‹€.

μ›μ‹œ 쿼리λ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ°λ³Έ 킀없이 증뢄 열을 μΆ”κ°€ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

exports.up = function (knex) {
  return Promise.all([
    knex.raw('alter table "my_table" add column "my_seq" bigserial'),
  ]);
};

exports.down = (knex) => {
  return Promise.all([
    knex.schema.table('my_table', (t) => {
      t.dropColumn('my_seq');
    }),
  ]);
};

λ˜λŠ” λ‹€μŒμ„ μ‚¬μš©ν•˜μ—¬ μžλ™ 증가 열을 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

table.specificType('myid','serial');

(Postgresqlμ—λ§Œ ν•΄λ‹Ή)

ν•˜μ§€λ§Œ table.increments() λŠ” table.increments().primary() μˆ˜λ™μœΌλ‘œ μ§€μ •ν•˜λŠ” κ²½μš°μ—λ§Œ PKλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

λ– λ‚˜μ§€ μ•ŠλŠ” 이유
increments: 'serial'
λŒ€μ‹ μ—
increments: 'serial primary key'

그게 무슨 λ¬Έμ œμž…λ‹ˆκΉŒ?

μ—¬μ „νžˆ 같은 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.
IMHO .increments 은 (λŠ”) PKλ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„μ•Όν•©λ‹ˆλ‹€.

이 λ¬Έμ œμ— λŒ€ν•œ μ†Œμ‹μ΄ μžˆμŠ΅λ‹ˆκΉŒ?

λ™μ˜ 함-λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œμ΄ 문제λ₯Ό ν•΄κ²°ν•  μˆ˜λŠ” μžˆμ§€λ§Œ APIκ°€ κΈ°λ³Έ ν‚€λ‘œ λ§Œλ“€μ§€ μ•Šκ³  μžλ™ 증가 열을 μƒμ„±ν•˜λŠ” 일급 지원이 μ—†λ‹€λŠ” 것은 λ‹€μ†Œ μ΄μƒν•©λ‹ˆλ‹€.

κ·Έλ ‡λ‹€κ³ ν•΄μ„œμ΄ λ¬Έμ œκ°€ 아직 ν•΄κ²°λ˜μ§€ μ•Šμ•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. κ°€μž₯ ν˜„λͺ…ν•œ λ°©μ‹μœΌλ‘œμ΄ 문제λ₯Ό μˆ˜μ •ν•˜λŠ” 것은 λΈŒλ ˆμ΄ν‚Ή μ²΄μΈμ§€μ΄λ―€λ‘œ 메이저 버전 λ²”ν”„μ˜ 일뢀 μ—¬μ•Όν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

λΏ‘λΏ‘
λ¬Έμ œλŠ” ν…Œμ΄λΈ”μ„ 생성 ν•  λ•Œ 열에 .primary() λ₯Ό μ‚¬μš©ν•˜λ©΄ ν…Œμ΄λΈ” μƒμ„±μ„μœ„ν•œ λ³„λ„μ˜ 쿼리와 κΈ°λ³Έ ν‚€λ₯Ό μ •μ˜ν•˜λŠ” 또 λ‹€λ₯Έ alter table μΏΌλ¦¬κ°€λ©λ‹ˆλ‹€.
MySQL (λ˜λŠ” μ•„λ§ˆλ„ λ‹€λ₯Έ DBMS)μ—μ„œλŠ” PK μ—†μ΄λŠ” auto_incremement ν•„λ“œλ₯Ό κ°€μ§ˆ 수 μ—†λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.
λ”°λΌμ„œ knexλŠ” κΈ°λ³Έ ν‚€λ‘œ ν…Œμ΄λΈ”μ„ 생성 ν•œ λ‹€μŒ ν…Œμ΄λΈ”μ— 이미 ν•˜λ‚˜κ°€ μžˆμœΌλ―€λ‘œ 두 개의 κΈ°λ³Έ ν‚€λ₯Ό μ •μ˜ν•˜κΈ° μœ„ν•΄ alter 만 ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€λ©΄ .increments μ—¬μ „νžˆ PKλ₯Ό μƒμ„±ν•˜μ§€λ§Œ ν•˜λ‚˜μ˜ create table μΏΌλ¦¬μ—μ„œ λ‹€λ₯Έ 열도 λͺ¨λ‘ PKκ°€λ˜λ„λ‘ ν—ˆμš©ν•˜λ―€λ‘œ μ£Ό 버전 λ²”ν”„κ°€ ν•„μš”ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.

λ˜λŠ”μ΄λ₯Ό μœ„ν•΄ λ‹€λ₯Έ μ—΄ μœ ν˜•μ„ μΆ”κ°€ν•˜κ³  이전 λ²„μ „κ³Όμ˜ ν˜Έν™˜μ„±μ„ 깨지 μ•Šλ„λ‘ .increments 을 κ·ΈλŒ€λ‘œ λ‘˜ 수 μžˆμŠ΅λ‹ˆλ‹€.

@ amir-s : knexκ°€ μž‘λ™ν•˜λŠ” 이유λ₯Ό 잘 μ„€λͺ…ν•©λ‹ˆλ‹€. μ§€μ›λ˜λŠ” λ‹€λ₯Έ DBMSμ—μ„œ λ™μΌν•œ μž‘λ™μ„ μ‹œλ„ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” νŠΉλ³„νžˆ μ’‹μ•„ν•˜μ§€ μ•Šμ§€λ§Œ 적어도 μ§€κΈˆμ€ μ΄μƒν•˜κ²Œ 보이지 μ•ŠμŠ΅λ‹ˆλ‹€.

μ œμ•ˆμ˜ λ¬Έμ œλŠ” μ •μ˜μ— 따라 ν…Œμ΄λΈ”μ— μ—¬λŸ¬ κΈ°λ³Έ ν‚€λ₯Ό κ°€μ§ˆ 수 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. (μ—¬λŸ¬ 열에 1 개의 볡합 PKλ₯Ό κ°€μ§ˆ 수 μžˆμ§€λ§Œ 2 개의 단일 μ—΄ PKλ₯Ό κ°–λŠ” κ²ƒκ³ΌλŠ” 맀우 λ‹€λ¦…λ‹ˆλ‹€.)

λ”°λΌμ„œ .increments κ°€ PKλ₯Ό μƒμ„±ν•˜λ©΄ λ‹€λ₯Έ 열도 PK둜 ν‘œμ‹œλ˜λ„λ‘ ν—ˆμš© ν•  수 μ—†μŠ΅λ‹ˆλ‹€. .increments 에 전달할 μˆ˜μžˆλŠ” μ˜΅μ…˜μ„ μƒμ„±ν•˜μ—¬ Postgres 및 μ΄λŸ¬ν•œ λ™μž‘μ„ μ§€μ›ν•˜λŠ” λ‹€λ₯Έ DBMSμ—μ„œ κΈ°λ³Έ ν‚€ λ™μž‘μ„ λΉ„ν™œμ„±ν™” ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λ§ˆλ„ 이전 λ²„μ „κ³Όμ˜ ν˜Έν™˜μ„±μ„ 깨지 μ•Šκ³  DBMS κ°„ ν˜Έν™˜μ„±μ„ 깨지 μ•ŠκΈ° λ•Œλ¬Έμ— 이것이 μ΅œμƒμ˜ μ†”λ£¨μ…˜ 일 κ²ƒμž…λ‹ˆλ‹€. λ‚˜λŠ” μ—¬μ „νžˆ Postgres의 κΈ°λ³Έ λ™μž‘μ„ λ³€κ²½ν•˜λŠ” κ²ƒλΏλ§Œ μ•„λ‹ˆλΌ .increments 도 PK둜 λ§Œλ“€μ§€ μ•Šμ§€λ§Œ 더 μ‰½κ²Œ λ°›μ•„ λ“€μ—¬μ§€λŠ” PR이 될 수 μžˆλ„λ‘ 그것을 μ’‹μ•„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λˆ„κ΅°κ°€κ°€ κ·Έ 라인을 따라 PR을 μ œμΆœν•˜κ³  μ‹Άλ‹€λ©΄ λ‚˜λŠ” κ·Έμ—κ²Œ μœ λ¦¬ν•˜λ‹€κ³  μ£Όμž₯ν•©λ‹ˆλ‹€. :-)

@zacronos μ£„μ†‘ν•©λ‹ˆλ‹€. "μ—¬λŸ¬ PK"λŠ” "μ—¬λŸ¬ 열에 ν•˜λ‚˜μ˜ PK"λ₯Ό μ˜λ―Έν–ˆμŠ΅λ‹ˆλ‹€.

μœ„μ˜ λͺ¨λ“  μ˜κ²¬μ— λ™μ˜ν•©λ‹ˆλ‹€. 이 λ™μž‘μ€ ν‚€κ°€ μ•„λ‹Œ μžλ™ 증가 μ—΄λΏλ§Œ μ•„λ‹ˆλΌ 볡합 κΈ°λ³Έ ν‚€λ₯Ό λ§Œλ“€λ €κ³  ν•  λ•Œ 예기치 μ•Šμ€ λ™μž‘μž…λ‹ˆλ‹€. 이것이 κ΅¬ν˜„λ˜λŠ” 것을 λ³΄λŠ” 것이 쒋을 κ²ƒμž…λ‹ˆλ‹€.

이 λ¬Έμ œλ„ λ°œμƒν•˜κ³  μžˆμ§€λ§Œ Postgres 을 μ‚¬μš©ν•˜κ³  직렬 ν•„λ“œλ₯Ό μ™Έλž˜ ν‚€λ‘œ μ‚¬μš©ν•˜λŠ” 경우- Postgres 직렬 ν•„λ“œμ˜ knex κ΅¬ν˜„μ€ increments() 그러면 기본적으둜 κΈ°λ³Έ ν‚€κ°€λ©λ‹ˆλ‹€. λ‚˜λŠ” postgres뿐만 μ•„λ‹ˆλΌ sqlite3λ₯Ό λΉŒλ“œ ν•  수 있기λ₯Ό μ›ν•˜λ―€λ‘œ μ›μ‹œ knex 쿼리λ₯Ό μ‚¬μš©ν•˜λ©΄ λ˜λŠ” λ‘˜ 쀑 ν•˜λ‚˜λ‘œ μ œν•œλ©λ‹ˆλ‹€. ν•΄κ²° 방법 μ œμ•ˆμ΄ μžˆμŠ΅λ‹ˆκΉŒ?

이 μŠ€λ ˆλ“œλŠ” ν•œλ™μ•ˆ λ§Žμ€ 관심을받지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. 이전 버전과 ν˜Έν™˜λ˜λŠ” 이상적인 μ†”λ£¨μ…˜μ΄λΌκ³  μƒκ°ν•˜λŠ” 것을 λ°˜λ³΅ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€ (λ”°λΌμ„œ λͺ¨λ“  λ§ˆμ΄λ„ˆ 릴리슀의 일뢀가 될 수 있음) : .increments() μƒˆ μ˜΅μ…˜μ„ μΆ”κ°€ν•˜κ±°λ‚˜ primaryKey: false 에 μΆ”κ°€ν•©λ‹ˆλ‹€. (κ°€λŠ₯ν•œ DBMS의 경우) κΈ°λŠ₯의 κΈ°λ³Έ ν‚€ 뢀뢄을 λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€.

.increments() λŠ” κΈ°λ³Έ λ™μž‘μ„ μœ μ§€ν•˜λ―€λ‘œ μ™„μ „νžˆ μ—­ ν˜Έν™˜λ©λ‹ˆλ‹€.

@zacronos μ½”λ“œλ₯Ό λΉ λ₯΄κ²Œ μ‚΄νŽ΄ λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μ‚¬μ†Œ ν•΄ λ³΄μž…λ‹ˆλ‹€. PR을 ν•¨κ»˜ λ˜μ§ˆκ±°μ•Ό
https://github.com/DeedMob/knex/tree/master/src

여기에도 같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. bigIncrements() κ°€ λ‹€λ₯Έ κΈ°λ³Έ ν‚€λ₯Ό λ§Œλ“€μ§€ μ•Šλ„λ‘ μ›μ‹œ 쿼리λ₯Ό μ‚¬μš©ν•΄μ•Όν•©λ‹ˆλ‹€.

ν•΄κ²° 방법 :

table.bigincrements();
table.biginteger('other').notNullable();
table.dropPrimary();
table.primary(['id', 'other']);

이 μ£Όμ œμ— λŒ€ν•œ 이전 쑰사λ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ΄ν•΄ν•˜λ©΄ 일뢀 DB (예 : MySQL)κ°€ κΈ°λ³Έ ν‚€κ°€ μ•„λ‹Œ 일련 번호λ₯Ό λ§Œλ“€ 수 μ—†κΈ° λ•Œλ¬Έμ— knexκ°€ κΈ°λ³Έ ν‚€λ₯Ό μ—„κ²©ν•˜κ²Œ κ°•μ œ μ μš©ν•©λ‹ˆκΉŒ? κ·Έλ ‡λ‹€λ©΄ Postgres와 κ΄€λ ¨ν•˜μ—¬ 이전 λ²„μ „κ³Όμ˜ ν˜Έν™˜μ„±μ— λŒ€ν•΄ λ„ˆλ¬΄ κ±±μ •ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.

그러면 MySQL μ‚¬μš©μžλŠ” 이것이 기본이 될 κ²ƒμœΌλ‘œ μ˜ˆμƒν•©λ‹ˆλ‹€.
Postgres μ‚¬μš©μžλŠ” 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€. _ (μœ„μ—μ„œ λΆ„λͺ…ν•œ 사싀) _

이런 이유둜 Postgresμ—μ„œ κΈ°λ³Έ ν‚€λ₯Ό _not_ κ°•μ œλ‘œ μ‘°μ •ν•˜κ³  λ³€κ²½ λ‘œκ·Έμ— μΆ”κ°€ν•˜λŠ” 것이 맀우 μ•ˆμ „ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. νŒ¨μΉ˜κ°€ μ•„λ‹ˆλΌ λ‹€μŒ 메이저 λ²„μ „μž…λ‹ˆλ‹€.

이런 이유둜 Postgresμ—μ„œ κΈ°λ³Έ ν‚€λ₯Ό κ°•μ œν•˜μ§€ μ•Šλ„λ‘ μ‘°μ •ν•˜κ³  λ³€κ²½ λ‘œκ·Έμ— μΆ”κ°€ν•˜λŠ” 것이 맀우 μ•ˆμ „ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. νŒ¨μΉ˜κ°€ μ•„λ‹ˆλΌ λ‹€μŒ 메이저 λ²„μ „μž…λ‹ˆλ‹€.

λ‚˜λŠ” 항상 κ·Έλ ‡κ²Œ μž‘λ™ ν•΄ μ™”κΈ° λ•Œλ¬Έμ— postgresql에 λŒ€ν•΄μ„œλ„ .primary() 없이 table.bigincrements('id') 만 μž‘μ„±ν•˜μ—¬ 항상 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μž‘μ„±ν•΄ 온 μˆ˜μ‹­ λͺ…μ˜ μ‚¬λžŒλ“€μ„ μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€.

κΈ°λ³Έ ν‚€λ₯Ό λ§Œλ“€μ§€ λ§μ•„μ•Όν•˜λŠ” μΆ”κ°€ μ˜΅μ…˜μ΄ μžˆμ§€λ§Œ κ±°κΈ°μ—μ—†λŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. 적어도 λ‚˜λŠ” κΈ°λ³Έ ν‚€ 생성 κ±΄λ„ˆ 뛰기에 λŒ€ν•œ postgres / mysql κ΅¬ν˜„μ— λŒ€ν•΄ 아무것도 찾지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

이것은 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ— λŒ€ν•œ μ£Όμš” ν•˜μœ„ ν˜Έν™˜μ„±μ„ κΉ¨λŠ” λ³€κ²½ 사항이 될 κ²ƒμž…λ‹ˆλ‹€. 이 이전 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ APIλ₯Ό 계속 νŒ¨μΉ˜ν•˜λ €λ©΄ λ¨Όμ € λͺ¨λ“  μ‚¬λžŒμ΄ λͺ¨λ“  knex λ²„μ „μ—μ„œ 이전 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μˆ˜μ •ν•˜μ§€ λͺ»ν•˜λ„둝 버전 관리 지원을 μΆ”κ°€ν•΄μ•Όν•©λ‹ˆλ‹€ (λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ½”λ“œμ˜ λ³€κ²½ 사항은 μ •ν™•νžˆ λ™μΌν•˜κ²Œ μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν•˜κΈ°κ°€ 맀우 μ–΄λ ΅μŠ΅λ‹ˆλ‹€. μžλ™ ν…ŒμŠ€νŠΈμ΄λ―€λ‘œ knex의 μ‚¬μš©μž μ½”λ“œμ—μ„œ 맀우 μ·¨μ•½ν•œ λΆ€λΆ„μž…λ‹ˆλ‹€).

μ–΄λ–€ 해결책이 μžˆμŠ΅λ‹ˆκΉŒ?

이것에 λŒ€ν•œ μ†Œμ‹μ΄ μžˆμŠ΅λ‹ˆκΉŒ?

이 μŠ€λ ˆλ“œλŠ” ν•œλ™μ•ˆ λ§Žμ€ 관심을받지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. 이전 버전과 ν˜Έν™˜λ˜λŠ” 이상적인 μ†”λ£¨μ…˜μ΄λΌκ³  μƒκ°ν•˜λŠ” 것을 λ°˜λ³΅ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€ (λ”°λΌμ„œ λͺ¨λ“  λ§ˆμ΄λ„ˆ 릴리슀의 일뢀가 될 수 있음) : .increments() μƒˆ μ˜΅μ…˜μ„ μΆ”κ°€ν•˜κ±°λ‚˜ primaryKey: false 에 μΆ”κ°€ν•©λ‹ˆλ‹€. (κ°€λŠ₯ν•œ DBMS의 경우) κΈ°λŠ₯의 κΈ°λ³Έ ν‚€ 뢀뢄을 λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€.

.increments() λŠ” κΈ°λ³Έ λ™μž‘μ„ μœ μ§€ν•˜λ―€λ‘œ μ™„μ „νžˆ μ—­ ν˜Έν™˜λ©λ‹ˆλ‹€.

이와 같은 증뢄을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? λͺ¨λ“  μ—…λ°μ΄νŠΈ?

μ–΄λ–»κ²Œ 된거 μ•Ό? 특히 MSSQLμ—μ„œ PK μ œμ•½μ€ 기본적으둜 이름이 μ§€μ •λ˜μ§€ μ•Šμ§€λ§Œ "PK__requests__DD771E3CC0CD0A5E"와 같이 정말 고톡 μŠ€λŸ½μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‚˜λŠ” 그것을 λ–¨μ–΄ 뜨리고 λ‹€λ₯Έ PKλ₯Ό λ§Œλ“€ μˆ˜λ„ μ—†μŠ΅λ‹ˆλ‹€.
μ œμ•½ 이름을 μ§€μ •ν–ˆμ§€λ§Œ increments ()에 λŒ€ν•΄ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

아직 아무것도 μ—†λ‚˜μš”?

.increments의 선택적 맀개 λ³€μˆ˜λ„ 맀우 μ’‹μ•„ν•  κ²ƒμž…λ‹ˆλ‹€! μ›μ‹œ μΏΌλ¦¬λŠ” λΆ„λͺ…νžˆ μž‘λ™ ν•  수 μžˆμ§€λ§Œ μ—¬λŸ¬ 개의 μ„œλ‘œ λ‹€λ₯Έ DBλ₯Ό μ‹€ν–‰ν•˜λŠ” μ‚¬μš©μžμ—κ²ŒλŠ” μ„±κ°€μ‹  μΌμž…λ‹ˆλ‹€ (예 : ν”„λ‘œλ•μ…˜μ„μœ„ν•œ mariadb, ν…ŒμŠ€νŠΈλ₯Όμœ„ν•œ sqlite). 이것에 λŒ€ν•œ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ? 이미 μ œμž‘ 된

두 번째둜 μ €λŠ” 이미 단일 ν”„λ‘œμ νŠΈμ—μ„œ 3 번이 ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œλ„ λ™μΌν•œ 문제둜 PK μ΄μŒμƒˆλ₯Ό λΉ„ν™œμ„±ν™”ν•˜λŠ” μΆ”κ°€ 맀개 λ³€μˆ˜κ°€ ν•©λ¦¬μ μž…λ‹ˆλ‹€.

# 2896κ³Ό μœ μ‚¬ν•˜κ²Œ MySQL에 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

t.primary(["cmdId", "deviceId"]);
t.specificType("cmdId", "int(10) unsigned AUTO_INCREMENT").notNullable();
t.string("deviceId", 16).notNullable().references("second_table.deviceId");
이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰

κ΄€λ ¨ 문제

mtom55 picture mtom55  Β·  3μ½”λ©˜νŠΈ

arconus picture arconus  Β·  3μ½”λ©˜νŠΈ

legomind picture legomind  Β·  3μ½”λ©˜νŠΈ

fsebbah picture fsebbah  Β·  3μ½”λ©˜νŠΈ

marianomerlo picture marianomerlo  Β·  3μ½”λ©˜νŠΈ