Knex: table.timestamps() update_ts . рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди CURRENT_TIMESTAMP рдкрд░ рд╕реЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдХреЛ рдирд┐рд░реНрдорд┐рдд 21 рдлрд╝рд░ре░ 2017  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: knex/knex

рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реЛрдирд╛:
updated_ts рдореЗрдВ table.timestamps() рдХреЙрд▓рдо рдмрдирд╛рддреЗ рд╕рдордп, рдЗрд╕рдХрд╛ рдбреАрдбреАрдПрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

рд╡рд╛рд╕реНрддрд╡рд┐рдХ:
ON UPDATE CURRENT_TIMESTAMP рднрд╛рдЧ рдЧрд╛рдпрдм рд╣реИ - updated_ts рдХреЙрд▓рдо рдХрднреА рднреА рд╕реНрд╡рддрдГ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдореИрдВ рдЬрд┐рд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ MySQL рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдЗрдВрдЬрдиреЛрдВ рдореЗрдВ рдХрд┐рддрдирд╛ рд╕рдВрдЧрдд рд╣реИред

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ timestamps() рдХреЛ рдпрд╛ рддреЛ рдпрд╣ рдСрдЯреЛ-рдЕрдкрдбреЗрдЯ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдмрд╕ рдпрд╣ рдорд╛рди рд▓рд┐рдпрд╛ рдерд╛ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░рдг рдереА рдХрд┐ timestamps() рдкрджреНрдзрддрд┐ рдмрд┐рд▓реНрдХреБрд▓ рдХреНрдпреЛрдВ рдореМрдЬреВрдж рд╣реИред

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

рдХрдо рд╕реЗ рдХрдо рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдмрд┐рд▓реНрдХреБрд▓ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ:

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

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ .autoUpdate() timestamp рдХреЙрд▓рдо рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдбрд░ рд╡рд┐рдзрд┐ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдлрд┐рд░ рднреА рдЗрд╕реЗ .timestamps() рд╕рд╣рд╛рдпрдХ рдХреЗ рд▓рд┐рдП рднреА рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ SQLite3 рдореЗрдВ рднреА рдЯреНрд░рд┐рдЧрд░реНрд╕ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред Oracle рдФрд░ mssql рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдЪреНрдЫреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЗрд╕реЗ рдЯреНрд░рд┐рдЧрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛! рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмреБрдХрд╢реЗрд▓реНрдлрд╝ рдкрд░ рдирд┐рд░реНрднрд░ рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдмреБрдХрд╢реЗрд▓реНрдлрд╝ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо-рдлрд╝реАрд▓реНрдб рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (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'))

рдмреБрдХрд╢реЗрд▓реНрдлрд╝ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо-рдлрд╝реАрд▓реНрдб рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (mysql):

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

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ update_at рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реВрдиреНрдп рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд╕рд╛рде рдЕрднреА рднреА update_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 рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдпрд╣ рдареАрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдо рдпрд╣рд╛рдВ рдХреНрдиреЗрдХреНрд╕ рдФрд░ рдмреБрдХрд╢реЗрд▓реНрдлрд╝ рдореБрджреНрджреЛрдВ рдХреЛ рдорд┐рд▓рд╛ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди @ Ice32 рдпрджрд┐ рдЖрдк рдмреБрдХрд╢реЗрд▓реНрдлрд╝ рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЕрдкрдиреА рдореЙрдбрд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ 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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

nklhrstv picture nklhrstv  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

saurabhghewari picture saurabhghewari  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

arconus picture arconus  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sandrocsimas picture sandrocsimas  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

marianomerlo picture marianomerlo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ