2017-04-20 71 views
4

我在我的應用程序中使用Knex查詢生成器和Postgres。我正在嘗試在UTC數據庫中添加一個created_atupdated_at字段,並使用ISO8016格式的數據。我想有我的數據是這樣的:Knex與Postgres以意想不到的方式存儲時間戳

2017-04-20T16:33:56.774Z 

在我Knex遷移,我一直在使用這兩個.timestamps()方法既創造created_at和手動updated_at.timestamp() 方法和命名他們自己嘗試。

當我種子我的數據庫並設置created_atupdated_at等於moment().utc().toISOString(),但它在我的數據庫存儲,因爲這:

2017-04-20 11:20:00.851-05 

有代碼和數據庫之間的東西改變了數據和我不不知道它是Knex,Postgres節點庫還是Postgres本身。

回答

2

Postgres以內部格式存儲時間戳,當您讀取它時,它會以您請求的格式顯示它。

knex_test=# update accounts set created_at = '2017-04-20T16:33:56.774Z';                                                             UPDATE 47 
knex_test=# select created_at from accounts where id = 3; 
     created_at   
---------------------------- 
2017-04-20 19:33:56.774+03 
(1 row) 

knex_test=# \d accounts 
             Table "public.accounts" 
    Column |   Type   |       Modifiers       
------------+--------------------------+------------------------------------------------------------- 
id   | bigint     | not null default nextval('test_table_one_id_seq'::regclass) 
last_name | character varying(255) | 
email  | character varying(255) | 
logins  | integer     | default 1 
about  | text      | 
created_at | timestamp with time zone | 
updated_at | timestamp with time zone | 
phone  | character varying(255) | 
Indexes: 
    "test_table_one_pkey" PRIMARY KEY, btree (id) 
    "test_table_one_email_unique" UNIQUE CONSTRAINT, btree (email) 
    "test_table_one_logins_index" btree (logins) 

knex_test=# 

您可以更改時區的Postgres返回時間戳與

knex_test=# SET timezone = 'UTC'; 
SET 
knex_test=# select created_at from accounts where id = 3; 
     created_at   
---------------------------- 
2017-04-20 16:33:56.774+00 
(1 row) 

knex_test=# 

您的連接,這裏是如何與knex做https://github.com/tgriesser/knex/issues/97

var knex = Knex.initialize({ 
    client: 'pg', 
    connection: { 
    host  : '127.0.0.1', 
    user  : 'your_database_user', 
    password : 'your_database_password', 
    database : 'myapp_test', 
    }, 
    pool: { 
    afterCreate: function(connection, callback) { 
     connection.query('SET timezone = timezone;', function(err) { 
     callback(err, connection); 
     }); 
    } 
} 
}); 
+0

我一直在玩這個和設置如你所描述的,針對實際數據庫的時區工作得很好,但試圖用'afterCreate'函數以編程方式執行,正如你所描述的那樣不能在我的遷移和種子上運行秒。有沒有辦法強制運行或檢查我是否不知道? – loganhuskins

+0

我把它運行在我的遷移和種子上,但我還沒有合適的時區。我會繼續嘗試。 – loganhuskins

+0

您應該能夠將該查詢作爲事務中的第一個查詢,然後在同一事務中的所有查詢都應具有正確的時區。此外,該設置完全不影響數據在postgres中的存儲/讀取方式,因此您不需要在遷移中進行設置。 –

相關問題