2011-08-09 23 views
12

estoy creando mesa con sqlalchemy.Cómo establecer por defecto en ACTUALIZACIÓN CURRENT_TIMESTAMP en MySQL con sqlalchemy?

user = Table('users', Metadata, 
Column('datecreated', TIMESTAMP,         
      server_default=text('CURRENT_TIMESTAMP')),    
Column('datemodified', TIMESTAMP,         
       server_onupdate=text('CURRENT_TIMESTAMP')), 
) 

Pero esto no configurará DEFAULT ON UPDATE CURRENT_TIMESTAMP.

Reviso este enlace, How do you get SQLAlchemy to override MySQL "on update CURRENT_TIMESTAMP", pero eso será literalmente necesario para conectarlo en la creación de la definición de la tabla.

Thx de antemano :)

Respuesta

11

Si estás en MySQL 5.6 o posterior favor desplaza hacia abajo por la respuesta correspondiente. Usuarios de versiones anteriores, por favor, lea este.


Hasta MySQL 5.6. en una tabla, solo puede tener una columna TIMESTAMP 'automatizada'.

Desde: http://dev.mysql.com/doc/refman/5.5/en/timestamp.html

Para una columna TIMESTAMP en una tabla, puede asignar la corriente marca de tiempo como el valor por defecto y el valor de actualización automática. Es posible tener la fecha y hora actual sea el valor por defecto para inicializar la columna, para el valor de actualización automática, o ambos. No es posible tener la fecha y hora actual sea el valor por defecto para una columna y el valor de actualización automática para otra columna.

+0

si voy a escribir 'user = Tabla ('usuarios', metadatos, columna ('DateCreated', DateTime), columna ('DateModified', fecha y hora, server_onupdate = texto ('CURRENT_TIMESTAMP')), ) ' Entonces, ¿funcionará para DEFAULT ON UPDATE CURRENT_TIMESTAMP? – Nilesh

+0

Lo comprobé con este ejemplo pero no está configurado como DEFAULT ON UPDATE CURRENT_TIMESTAMP. cuando lo usamos para una sola columna. :( – Nilesh

+0

Si esto no es posible, entonces también por favor hágamelo saber cómo puedo configurar el activador de actualización en sqlalchemy? – Nilesh

12

Puede secuestrar el server_default para establecer también la actualización en:

Column('datemodified', TIMESTAMP, 
     server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')) 

Esto genera la siguiente entrada de la columna:

datemodified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 

Sin embargo, la respuesta de MCHL sigue siendo válida: Sólo puede haber una columna TIMESTAMP automatizado en una tabla (http://dev.mysql.com/doc/refman/5.5/en/timestamp.html)

Tenga en cuenta también que el orden de la col umns es importante! Si usted tiene una columna TIMESTAMP sin DEFAULT y modificadores ON UPDATE, y es la primera columna TIMESTAMP en su mesa, automáticamente se ha establecido como predeterminado CURRENT_TIMESTAMP DE ACTUALIZACIÓN CURRENT_TIMESTAMP. (http://dev.mysql.com/doc/refman/5.5/en/timestamp.html)

Así que esto está muy bien:

Column('datemodified', TIMESTAMP, 
     server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')) 
Column('datecreated', TIMESTAMP) 

mientras que esto no es:

Column('datecreated', TIMESTAMP) 
Column('datemodified', TIMESTAMP, 
     server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')) 

Con el fin de establecer la `DateCreated' a la hora actual durante la primera entrada de una fila, simplemente establezca su valor explícitamente en NULL. Una vez más, desde http://dev.mysql.com/doc/refman/5.5/en/timestamp.html:

Por defecto, las columnas TIMESTAMP no son NULL, no puede contener NULL valores, y asignar NULL asigna la fecha y hora actual.

+0

Esta fue la única forma que funcionó para mí, ninguna combinación de 'server_onupdate = text ('CURRENT_TIMESTAMP')' sería suficiente si estás en mysql 5.6+ (que , por ahora, la mayoría de las personas deberían estarlo), esta debería ser la respuesta aceptada. – domoarrigato

4
Column('datemodified', 
     TIMESTAMP,         
     server_onupdate=text(
      ' ON UPDATE '.join([str(func.current_timestamp())] * 2))) 

Este modo de usar la función interna de SQLAlchemy func.current_timestamp().

Cuestiones relacionadas