рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реЛрдирд╛:
updated_ts
рдореЗрдВ table.timestamps()
рдХреЙрд▓рдо рдмрдирд╛рддреЗ рд╕рдордп, рдЗрд╕рдХрд╛ рдбреАрдбреАрдПрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
рд╡рд╛рд╕реНрддрд╡рд┐рдХ:
ON UPDATE CURRENT_TIMESTAMP
рднрд╛рдЧ рдЧрд╛рдпрдм рд╣реИ - updated_ts
рдХреЙрд▓рдо рдХрднреА рднреА рд╕реНрд╡рддрдГ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдореИрдВ рдЬрд┐рд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ MySQL рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдЗрдВрдЬрдиреЛрдВ рдореЗрдВ рдХрд┐рддрдирд╛ рд╕рдВрдЧрдд рд╣реИред
рдХрдо рд╕реЗ рдХрдо рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдмрд┐рд▓реНрдХреБрд▓ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ:
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
рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐
timestamps()
рдХреЛ рдпрд╛ рддреЛ рдпрд╣ рдСрдЯреЛ-рдЕрдкрдбреЗрдЯ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдмрд╕ рдпрд╣ рдорд╛рди рд▓рд┐рдпрд╛ рдерд╛ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░рдг рдереА рдХрд┐timestamps()
рдкрджреНрдзрддрд┐ рдмрд┐рд▓реНрдХреБрд▓ рдХреНрдпреЛрдВ рдореМрдЬреВрдж рд╣реИред