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

时间:2011-08-09 06:41:20

标签: mysql sqlalchemy

我正在使用sqlalchemy创建表。

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

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

我查看此链接, How do you get SQLAlchemy to override MySQL "on update CURRENT_TIMESTAMP"但是对于文字,我需要在创建表定义中连接它。

提前Thx:)

5 个答案:

答案 0 :(得分:16)

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

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

这将生成以下列条目:

datemodified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

但是,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)

虽然不是这样:

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

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

  

默认情况下,TIMESTAMP列为NOT NULL,不能包含NULL   值,并指定NULL指定当前时间戳。

答案 1 :(得分:12)

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


直到MySQL 5.6。在一个表中,您只能有一个“自动”TIMESTAMP列。

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

  

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:1)

这适用于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'))

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

答案 4 :(得分:0)

如果在MySQL中更新CURRENT_TIMESTAMP时你想要的只是DEFAULT CURRENT_TIMESTAMP,那么只需将sqlalchemy中的TIMESTAMP列设置为非可空作品

Column(TIMESTAMP, nullable=False)