我正在使用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:)
答案 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)