次ã®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
ã¡ãœããã¯å¥ã®PKãäœæããŠãšã©ãŒãåŒãèµ·ãããšæããŸãã
ãã®åœ¢åŒã®ããŒãã«ãå®çŸããããšã¯å¯èœã§ããïŒ
ãããããããããããããããã¹ãã§ãã ç§ã¯ããã«ã€ããŠäœãã調ã¹ãŸãã
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ãäœæã§ããŸãã
ç§ãä»äœ¿ã£ãŠããworkaroudãšããŠïŒ
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().primary()
ã§æåã§æå®ããå Žåã«ã®ã¿ã table.increments()
ãPKãäœæããæ¹ãã¯ããã«åªããŠãããšæããŸãã
é¢ããŠã¿ãŸãããincrements: 'serial'
ã®ä»£ããã«increments: 'serial primary key'
ããã®åé¡ã¯äœã§ããïŒ
ããã§ãåããšã©ãŒãçºçããŸãã
IMHO .increments
ã¯PKãäœæããã¹ãã§ã¯ãããŸããã
ãã®åé¡ã«é¢ãããã¥ãŒã¹ã¯ãããŸããïŒ
åæããŸãã-ãã®åé¡ãããŸããŸãªæ¹æ³ã§åé¿ããããšã¯ç¢ºãã«å¯èœã§ãããAPIãäž»ããŒã«ããã«èªåã€ã³ã¯ãªã¡ã³ãåãäœæããããã®ãã¡ãŒã¹ãã¯ã©ã¹ã®ãµããŒããæã£ãŠããªãã®ã¯ããªãå¥åŠã§ãã
ããã¯èšã£ãŠããããã¯ãŸã ä¿®æ£ãããŠããªããšæããŸãããããæãè³¢æãªæ¹æ³ã§ä¿®æ£ããããšã¯é倧ãªå€æŽã§ãããã¡ãžã£ãŒããŒãžã§ã³ã®ãã³ãã®äžéšã§ããå¿ èŠãããããã§ãã
@zacronos
ããŒãã«ãäœæãããšãã«åã§.primary()
ã䜿çšãããšãçµæã¯ããŒãã«ãäœæããããã®åå¥ã®ã¯ãšãªãšãäž»ããŒãå®çŸ©ããããã®å¥ã®alter table
ã¯ãšãªã«ãªããŸãã
MySQLïŒãŸãã¯ããããä»ã®DBMSãïŒã§ã¯ãPKã§ãªããã°auto_incremement
ãã£ãŒã«ããæã€ããšã¯ã§ããªããšæããŸãã
ãããã£ãŠãknexã¯äž»ããŒã䜿çšããŠããŒãã«ãäœæããŸãããããŒãã«ã«ã¯ãã§ã«1ã€ããããã alter
ã§2ã€ã®äž»ããŒãå®çŸ©ããããšã¯ã§ããŸããã
ãããä¿®æ£ã§ããã°ããããã.increments
ã¯PKãäœæããŸãããä»ã®åããã¹ãŠ1ã€ã®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ããšã¯ããè€æ°ã®åã«1ã€ã®PKããæå³ããŸãã
äžèšã®ãã¹ãŠã®ã³ã¡ã³ãã«åæããŸãã ãã®åäœã¯ãè€åäž»ããŒãšéããŒã®èªåã€ã³ã¯ãªã¡ã³ãåãäœæããããšãããšãã«äºæããªããã®ã§ããã ãããå®è£ ãããã®ãèŠãã®ã¯çŽ æŽãããããšã§ãã
ç§ããã®åé¡ã«çŽé¢ããŠããŸããã Postgres
Postgres
ã䜿çšããå€éšããŒãšããŠã·ãªã¢ã«ãã£ãŒã«ãã䜿çšããŠããå Žåã Postgres
ã·ãªã¢ã«ãã£ãŒã«ãã®knexå®è£
ã¯increments()
ããã«ãããããã©ã«ãã§ããããäž»ããŒã«ãªããŸãã postgresã ãã§ãªãsqlite3ããã«ãã§ããããã«ãããã®ã§ãçã®knexã¯ãšãªã䜿çšãããšããŸãã¯ã®ããããã«å¶éãããŸãã åé¿çã®ææ¡ã¯ãããŸããïŒ
ãã®ã¹ã¬ããã¯ãã°ããã®éããŸã泚ç®ãããŠããŸããã çæ³çãªäžäœäºææ§ã®ãããœãªã¥ãŒã·ã§ã³ïŒãããã£ãŠããã€ããŒãªãªãŒã¹ã®äžéšã«ãªãå¯èœæ§ããããŸãïŒã§ãããšç§ãæãããšãç¹°ãè¿ããããšæããŸãã .increments()
ã«æ°ãããªãã·ã§ã³ãè¿œå ããŸããããããprimaryKey: false
ã§ãã ïŒãããå¯èœãªDBMSã®å ŽåïŒãã®æ©èœã®äž»ããŒéšåãç¡å¹ã«ããŸãã
.increments()
ã¯ããã©ã«ãã®åäœãä¿æããŠãããããããã¯å®å
šã«äžäœäºææ§ããããŸãã
@zacronosã³ãŒãã
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ã§äž»ããŒã匷å¶ããªãããã«èª¿æŽããŠå€æŽãã°ã«è¿œå ããã®ã¯ããªãå®å šã ãšæããŸãã ããããšããŠã§ã¯ãªãã次ã®ã¡ãžã£ãŒããŒãžã§ã³çšã§ãã
ãã®ããã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ïŒãå®è¡ãã人ã«ãšã£ãŠã¯ç ©ããããã®ã§ãã ããã«é¢ããæŽæ°ã¯ãããŸããïŒ ãã§ã«PRãè¡ãããŠããããã§ãããã¡ãã£ãšé»ã£ãŠããŸãããïŒ
ããäžåºŠèšããŸããã1ã€ã®ãããžã§ã¯ãã§ãã§ã«3åå¿ èŠã§ããã
ããã§ãåãåé¡ããããŸãããPKã·ãŒã ãç¡å¹ã«ããããã®è¿œå ã®ãã©ã¡ãŒã¿ããããŸãã
MySQLã«äœ¿çšã§ããïŒ2896ãšåæ§ã§ãã
t.primary(["cmdId", "deviceId"]);
t.specificType("cmdId", "int(10) unsigned AUTO_INCREMENT").notNullable();
t.string("deviceId", 16).notNullable().references("second_table.deviceId");
æãåèã«ãªãã³ã¡ã³ã
ãŸãã¯ãã§èªåã€ã³ã¯ãªã¡ã³ãåãäœæã§ããŸã
ïŒPostgresqlã®å Žåã®ã¿ïŒ
ãããã
table.increments().primary()
ã§æåã§æå®ããå Žåã«ã®ã¿ãtable.increments()
ãPKãäœæããæ¹ãã¯ããã«åªããŠãããšæããŸãã