Mengharapkan:
Saat membuat kolom updated_ts
di table.timestamps()
, DDL-nya harus:
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Sebenarnya:
Bagian ON UPDATE CURRENT_TIMESTAMP
tidak ada - kolom updated_ts
tidak pernah diperbarui secara otomatis.
Sintaks yang saya jelaskan berfungsi untuk MySQL, saya tidak yakin seberapa kompatibel di seluruh mesin basis data.
Setidaknya dengan sintaks postgres tidak terlalu bagus:
http://stackoverflow.com/questions/1035980/update-timestamp-when-row-is-updated-in-postgresql
Meskipun saya ingin memiliki .autoUpdate()
builder metode untuk timestamp
kolom, maka akan sepele untuk mengaktifkan bahwa untuk .timestamps()
pembantu juga.
Sepertinya SQLite3 juga memiliki pemicu yang dapat digunakan untuk mengimplementasikan ini. Oracle dan mssql mungkin juga memiliki sintaks yang lebih bagus untuknya atau setidaknya bisa dilakukan dengan pemicu.
Ini akan sangat bagus! saat ini kita perlu bergantung pada rak buku yang memperbarui stempel waktu kita, kan?
Alih-alih mengandalkan rak buku, Anda dapat membuat bidang datetime secara manual (mysql):
table.dateTime('created_at').notNullable().defaultTo(knex.raw('CURRENT_TIMESTAMP'))
table.dateTime('updated_at').defaultTo(knex.raw('NULL ON UPDATE CURRENT_TIMESTAMP'))
Atau jika Anda lebih suka updated_at
sebagai default ke waktu pembuatan juga:
table.dateTime('created_at').notNullable().defaultTo(knex.raw('CURRENT_TIMESTAMP'))
table.dateTime('updated_at').notNullable().defaultTo(knex.raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))
Alih-alih mengandalkan rak buku, Anda dapat membuat bidang datetime secara manual (mysql):
table.dateTime('created_at').notNullable().defaultTo(knex.raw('CURRENT_TIMESTAMP')) table.dateTime('updated_at').defaultTo(knex.raw('NULL ON UPDATE CURRENT_TIMESTAMP'))
Menggunakan kode yang Anda posting untuk updated_at dengan default nol masih memasukkan stempel waktu saat ini untuk updated_at.
const UserModel = bookshelf.Model.extend({
tableName: 'users',
hasTimestamps: ['createdAt', 'updatedAt'],
});
Tes ini gagal:
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'));
});
Sunting:
Nevermind, tampaknya menghapus hasTimestamps
sepenuhnya dari definisi model akan memperbaikinya.
Kami mencampur masalah Knex dan Rak Buku di sini, tetapi hasTimestamps: ['createdAt', 'updatedAt']
dari definisi model Anda. Kode yang diposting @codeclown di atas kemudian akan berfungsi seperti yang diharapkan.
Solusi saya:
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")
);
Saya pikir timestamps()
perlu menyediakan fungsionalitas pembaruan otomatis ini atau dokumen perlu secara eksplisit menyatakan bahwa itu tidak. Saya hanya berasumsi bahwa fungsionalitas adalah alasan penting mengapa metode timestamps()
ada sama sekali.
Metode timestamps()
tidak berguna bagi saya karena tidak dapat mengatur on update current_timestamp
.
Komentar yang paling membantu
Saya pikir
timestamps()
perlu menyediakan fungsionalitas pembaruan otomatis ini atau dokumen perlu secara eksplisit menyatakan bahwa itu tidak. Saya hanya berasumsi bahwa fungsionalitas adalah alasan penting mengapa metodetimestamps()
ada sama sekali.