如何使用sqlalchemy在mysql中设置DEFAULT ON UPDATE CURRENT_TIMESTAMP?

Nil*_*esh 13 mysql sqlalchemy

我正在用sqlalchemy创建表.

user = Table('users', Metadata,
Column('datecreated', TIMESTAMP,                                  
            server_default=text('CURRENT_TIMESTAMP')),            
Column('datemodified', TIMESTAMP,                                 
               server_onupdate=text('CURRENT_TIMESTAMP')),
)
Run Code Online (Sandbox Code Playgroud)

但是这不会设置DEFAULT ON UPDATE CURRENT_TIMESTAMP.

我查看这个链接, 你如何让SQLAlchemy在更新CURRENT_TIMESTAMP上覆盖MySQL,但是对于文字,我需要在create table definition中连接它.

Thx提前:)

Mar*_*tin 20

您可以劫持server_default以设置ON UPDATE:

Column('datemodified', TIMESTAMP,
       server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))
Run Code Online (Sandbox Code Playgroud)

这会生成以下列条目:

datemodified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Run Code Online (Sandbox Code Playgroud)

但是,Mchl的答案仍然适用:表中只能有一个自动TIMESTAMP列(http://dev.mysql.com/doc/refman/5.5/en/timestamp.html)

另请注意,列的顺序非常重要!如果您有一个没有DEFAULT和ON UPDATE修饰符的TIMESTAMP列,并且它是表中的第一个TIMESTAMP列,它将自动设置为DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP.(http://dev.mysql.com/doc/refman/5.5/en/timestamp.html)

所以这很好:

Column('datemodified', TIMESTAMP,
       server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))
Column('datecreated', TIMESTAMP)
Run Code Online (Sandbox Code Playgroud)

虽然这不是:

Column('datecreated', TIMESTAMP)
Column('datemodified', TIMESTAMP,
       server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))
Run Code Online (Sandbox Code Playgroud)

为了在行的第一次输入期间将"datecreated"设置为当前时间,只需将其值显式设置为NULL.同样,来自http://dev.mysql.com/doc/refman/5.5/en/timestamp.html:

默认情况下,TIMESTAMP列为NOT NULL,不能包含NULL值,而赋值NULL则指定当前时间戳.


Mch*_*chl 12

如果您使用的是MySQL 5.6或更高版本,请向下滚动查看相关答案.旧版本的用户,请阅读本文.


直到MySQL 5.6.在一个表中,您只能有一个"自动"TIMESTAMP列.

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

对于表中的一个TIMESTAMP列,您可以将当前时间戳指定为默认值和自动更新值.可以将当前时间戳作为初始化列,自动更新值或两者的默认值.当前时间戳不可能是一列的默认值和另一列的自动更新值.

  • 对于那些追求 mysql 5.6 的人,不要停在这里,下面有一个很好的答案...... (2认同)

use*_*974 9

这适用于 Mysql 8

sa.Column('created_at', sa.TIMESTAMP, server_default=func.now()),
sa.Column('updated_at', sa.TIMESTAMP, server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))
Run Code Online (Sandbox Code Playgroud)

由于某种原因,server_onupdate 选项不起作用。


Yaj*_*ajo 6

from sqlalchemy.sql import func

Column('datemodified',
       TIMESTAMP,                                 
       server_onupdate=text(
           ' ON UPDATE '.join([str(func.current_timestamp())] * 2)))
Run Code Online (Sandbox Code Playgroud)

这样您就可以使用 SQLAlchemy 的内部func.current_timestamp()函数。