2011-08-09 68 views
12

我正在用sqlalchemy創建表。如何使用sqlalchemy在mysql中設置DEFAULT ON UPDATE CURRENT_TIMESTAMP?

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提前:)

回答

11

如果你在MySQL 5.6或更高版本請向下滾動的相關答案。舊版本的用戶請閱讀本文。


直到MySQL 5.6。在一張表中,您只能有一個'自動'TIMESTAMP列。

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

對於表中有一個時間戳列,您可將當前 時間戳爲默認值和自動更新的值。 可能會將當前時間戳設爲默認值 初始化列,自動更新值或兩者。不是 可能會將當前時間戳記作爲一個 列的默認值以及另一列的自動更新值。

+0

如果我將寫 '用戶=表( '用戶',元數據, 柱( 'dateCreated會',日期時間), 柱( 'datemodified',時間戳, server_onupdate =文本( 'CURRENT_TIMESTAMP')), )' 然後它將工作在DEFAULT ON UPDATE CURRENT_TIMESTAMP? – Nilesh

+0

我檢查了這個例子,但它沒有設置DEFAULT ON UPDATE CURRENT_TIMESTAMP。當我們用於單列。 :( – Nilesh

+0

如果這是不可能的,那麼請讓我知道我怎麼能在sqlalchemy中設置onupdate觸發器? – Nilesh

12

可以劫持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

默認情況下,時間戳列是NOT NULL,不能包含NULL值 ,並指派NULL分配當前時間戳。

+0

這是我工作的唯一方法,沒有'server_onupdate = text('CURRENT_TIMESTAMP')'的組合會發揮作用。如果你在MySQL 5.6+到現在爲止,大多數人應該是),這應該是被接受的答案。 – domoarrigato

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

您使用SQLAlchemy的內心func.current_timestamp()功能這樣。

相關問題