Knex: table.timestamps() harus disetel ON UPDATE CURRENT_TIMESTAMP untuk updated_ts

Dibuat pada 21 Feb 2017  ·  8Komentar  ·  Sumber: knex/knex

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.

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 metode timestamps() ada sama sekali.

Semua 8 komentar

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 .

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

fsebbah picture fsebbah  ·  3Komentar

legomind picture legomind  ·  3Komentar

koskimas picture koskimas  ·  3Komentar

arconus picture arconus  ·  3Komentar

mtom55 picture mtom55  ·  3Komentar