Knex: table.timestamps () debe establecerse ON UPDATE CURRENT_TIMESTAMP para updated_ts

Creado en 21 feb. 2017  ·  8Comentarios  ·  Fuente: knex/knex

Esperado:
Al crear la columna updated_ts en table.timestamps() , su DDL debe ser:

timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Real:
El ON UPDATE CURRENT_TIMESTAMP pieza falta - el updated_ts columna no se autoupdated.

La sintaxis que estoy describiendo funciona para MySQL, no estoy seguro de qué tan compatible es entre los motores de base de datos.

Comentario más útil

Creo que timestamps() debe proporcionar esta funcionalidad de actualización automática o los documentos deben indicar explícitamente que no lo hace. Simplemente asumí que la funcionalidad era una razón fundamental por la cual el método timestamps() existe.

Todos 8 comentarios

Al menos con la sintaxis de Postgres no es exactamente tan agradable:

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

Aunque me gustaría tener el método .autoUpdate() builder para la columna timestamp , sería trivial habilitarlo también para .timestamps() helper.

Parece que SQLite3 también tiene activadores que podrían usarse para implementar esto. Oracle y mssql también podrían tener una sintaxis más agradable o al menos se podría hacer con desencadenadores.

¡Sería tan bueno! actualmente tenemos que depender de la actualización de la estantería de nuestras marcas de tiempo, ¿verdad?

En lugar de depender de la estantería, puede crear los campos de fecha y hora manualmente (mysql):

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

O si prefiere updated_at para que el tiempo de creación también sea predeterminado:

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

En lugar de depender de la estantería, puede crear los campos de fecha y hora manualmente (mysql):

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

El uso del código que publicó para updated_at con un valor predeterminado nulo aún inserta la marca de tiempo actual para updated_at.

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

Esta prueba falla:

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'));
  });

Editar:
No importa, parece que eliminar completamente hasTimestamps de la definición del modelo soluciona esto.

Aquí estamos mezclando problemas de Knex y Bookshelf, pero @ Ice32 si no desea utilizar la función de marca de tiempo automática de Bookshelf, debe eliminar hasTimestamps: ['createdAt', 'updatedAt'] de la definición de su modelo. El código que @codeclown publicó anteriormente funcionará como se esperaba.

Mi solución:

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")
        );

Creo que timestamps() debe proporcionar esta funcionalidad de actualización automática o los documentos deben indicar explícitamente que no lo hace. Simplemente asumí que la funcionalidad era una razón fundamental por la cual el método timestamps() existe.

El método timestamps() es inútil para mí porque no puedo configurar on update current_timestamp .

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

legomind picture legomind  ·  3Comentarios

PaulOlteanu picture PaulOlteanu  ·  3Comentarios

tjwebb picture tjwebb  ·  3Comentarios

zettam picture zettam  ·  3Comentarios

mtom55 picture mtom55  ·  3Comentarios