2013-06-24 43 views
4

嘗試將列設置爲行創建時間時,使用SQLAlchemy,alembic和postgres,我最終得到的是一個字段,該字段默認爲表本身的時間被創建,而不是創建行的時間。設置爲表創建時間而不是行創建時間的字段默認時間戳

型號代碼:

datetime = sa.Column(sa.DateTime, nullable=False, server_default=func.now()) 

蒸餾器將其轉換爲:

sa.Column('datetime', sa.DateTime(), server_default='now()', nullable=False), 

,在Postgres裏列:

datetime | timestamp without time zone | not null default '2013-06-24 11:28:14.930524'::timestamp without time zone 

我應該怎麼做,這樣的默認值是行創作時間?

+0

而不是提交一個正確的答案,你可以嘗試'server_default = func.now'而不是'server_default = func.now()。 – Doobeh

+0

@Doobeh:我想到了這一點,它將有意義,因爲它打算傳遞的是一個函數而不是一個值,但似乎調用該函數是在SQLAlchemy中執行的方式。嘗試觸發以下錯誤:sqlalchemy.exc.ArgumentError:參數'arg'預計爲''或''或'< class'sqlalchemy.sql.expression.TextClause'>',得到了'

+1

在黑暗中有一點點 - 我習慣使用'default = datetime .now'描述我的時間戳列。我發現(並測試)了一個使用'server_default'的解決方案,我將作爲答案離開。 – Doobeh

回答

8

啊哈,它的工作似乎out--你需要告訴server_default命令,如果你在某些SQL需要要在DBMS本身執行的發送:

from sqlalchemy import text 

class Test(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    created = db.Column(db.DateTime, server_default=text('now()')) 

這產生:

CREATE TABLE test (
    id SERIAL NOT NULL, 
    created TIMESTAMP WITHOUT TIME ZONE DEFAULT now(), 
    PRIMARY KEY (id) 
) 
+0

謝謝,我會在之後嘗試。但是這隻適用於Postgres,對吧? –

+0

你只是告訴它'嘿,不要處理這一點,只是把它添加到這個專欄的SQL DDL,沒有問題問'。如果你的DBMS使用'OMG_RIGHT_NOW()'而不是'NOW()',那麼你需要調整它。 – Doobeh