Knex: table.timestamps()๋Š” updated_ts์— ๋Œ€ํ•ด ON UPDATE CURRENT_TIMESTAMP๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 02์›” 21์ผ  ยท  8์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: knex/knex

์˜ˆ์ƒ๋˜๋Š”:
table.timestamps() updated_ts ์—ด์„ ๋งŒ๋“ค ๋•Œ ํ•ด๋‹น DDL์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

์‹ค์ œ:
ON UPDATE CURRENT_TIMESTAMP ๋ถ€๋ถ„์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. updated_ts ์—ด์€ ์ž๋™ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์„ค๋ช…ํ•˜๋Š” ๊ตฌ๋ฌธ์€ MySQL์—์„œ ์ž‘๋™ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„ ๊ฐ„์— ์–ผ๋งˆ๋‚˜ ํ˜ธํ™˜๋˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

timestamps() ์ด ์ž๋™ ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ๋ฌธ์„œ์—์„œ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ์„ค๋ช…ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ˆœํžˆ timestamps() ๋ฉ”์†Œ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ์ค‘์š”ํ•œ ์ด์œ ๊ฐ€ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  8 ๋Œ“๊ธ€

์ ์–ด๋„ postgres ๊ตฌ๋ฌธ์€ ๊ทธ๋‹ค์ง€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

http://stackoverflow.com/questions/1035980/update-timestamp-when-row-is-updated-in-postgresql

timestamp ์—ด์— .autoUpdate() ๋นŒ๋” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€๋งŒ .timestamps() ๋„์šฐ๋ฏธ์—๋„ ์ด๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

SQLite3์—๋„ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Oracle ๋ฐ mssql์—๋Š” ๋” ๋‚˜์€ ๊ตฌ๋ฌธ์ด ์žˆ๊ฑฐ๋‚˜ ์ตœ์†Œํ•œ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋„ˆ๋ฌด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค! ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์ฑ…์žฅ์— ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งž๋‚˜์š”?

์ฑ…์žฅ์— ์˜์กดํ•˜๋Š” ๋Œ€์‹  ์ˆ˜๋™์œผ๋กœ datetime-fields(mysql)๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

table.dateTime('created_at').notNullable().defaultTo(knex.raw('CURRENT_TIMESTAMP'))
table.dateTime('updated_at').defaultTo(knex.raw('NULL ON UPDATE CURRENT_TIMESTAMP'))

๋˜๋Š” updated_at ๋ฅผ ์ƒ์„ฑ ์‹œ๊ฐ„์œผ๋กœ ๊ธฐ๋ณธ ์„ค์ •ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ:

table.dateTime('created_at').notNullable().defaultTo(knex.raw('CURRENT_TIMESTAMP'))
table.dateTime('updated_at').notNullable().defaultTo(knex.raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))

์ฑ…์žฅ์— ์˜์กดํ•˜๋Š” ๋Œ€์‹  ์ˆ˜๋™์œผ๋กœ datetime-fields(mysql)๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

table.dateTime('created_at').notNullable().defaultTo(knex.raw('CURRENT_TIMESTAMP'))
table.dateTime('updated_at').defaultTo(knex.raw('NULL ON UPDATE CURRENT_TIMESTAMP'))

๊ธฐ๋ณธ๊ฐ’์ด null์ธ updated_at์— ๋Œ€ํ•ด ๊ฒŒ์‹œํ•œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ์ „ํžˆ updated_at์— ๋Œ€ํ•œ ํ˜„์žฌ ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค.

const UserModel = bookshelf.Model.extend({
  tableName: 'users',
  hasTimestamps: ['createdAt', 'updatedAt'],
});

์ด ํ…Œ์ŠคํŠธ๋Š” ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

it('doesntStoreUpdatedAtForCreation', async () => {
    // arrange && act
    const inserted = await new UserModel().save();

    // assert
    const retrievedModel = await UserModel.where({ id: inserted.id }).fetch();
    assert.notExists(retrievedModel.get('updatedAt'));
  });

ํŽธ์ง‘ํ•˜๋‹ค:
์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ์„ธ์š”. ๋ชจ๋ธ ์ •์˜์—์„œ hasTimestamps ๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” Knex์™€ Bookshelf ๋ฌธ์ œ๋ฅผ ํ˜ผํ•ฉํ•˜๊ณ  ์žˆ์ง€๋งŒ @Ice32 Bookshelf์˜ ์ž๋™ ํƒ€์ž„์Šคํƒฌํ”„ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ๋ชจ๋ธ ์ •์˜์—์„œ hasTimestamps: ['createdAt', 'updatedAt'] ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์œ„์— @codeclown์ด ๊ฒŒ์‹œํ•œ ์ฝ”๋“œ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์†”๋ฃจ์…˜:

const Database = use("Database");
/*......*/
table
        .timestamp("created_at")
        .notNullable()
        .defaultTo(Database.raw("CURRENT_TIMESTAMP"));

table
        .timestamp("updated_at")
        .notNullable()
        .defaultTo(
            Database.raw("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
        );

timestamps() ์ด ์ž๋™ ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ๋ฌธ์„œ์—์„œ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ์„ค๋ช…ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ˆœํžˆ timestamps() ๋ฉ”์†Œ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ์ค‘์š”ํ•œ ์ด์œ ๊ฐ€ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

timestamps() ๋ฉ”์„œ๋“œ๋Š” on update current_timestamp ์„ค์ •ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์—๊ฒŒ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰