2012-11-14 27 views
5

在rails中,我創建了一個名爲open_time的字符串列,但後來我意識到我應該使用datetime類型。我做在PostgreSQL中將字段類型從字符變爲不帶時區的時間戳

change_column :polls, :open_time, :datetime 

但它說:

PG::Error: ERROR: column "open_time" cannot be cast to type timestamp without time zone 
: ALTER TABLE "polls" ALTER COLUMN "open_time" TYPE timestamp 

如果我只是下降的字符串列,並添加新的datetime列,我將失去存儲在字符串列中的數據。另外,在PostgreSQL裏我加列:

ALTER TABLE polls ADD COLUMN published_time timestamp; 

然後我試圖從像字符串列獲取數據:

UPDATE polls SET published_time = strToTimeStamp(open_time); 

所以我的問題是是否有任何功能,我可以爲strToTimeStamp使用可將字符變化類型轉換爲沒有時區類型的時間戳?

+2

你想'ALTER COLUMN ... USING'。看到例如http://stackoverflow.com/search?q=%5Bpostgresql%5D%20ALTER%20COLUMN%20using(near-dup) –

回答

5

..有什麼功能,我可以爲strToTimeStamp使用,可以轉換 字符改變類型沒有時區類型時間戳?

使用to_timestamp()可以更改該列的數據類型。

ALTER TABLE tbl ALTER COLUMN col TYPE timestamp 
USING to_timestamp(col, '<your pattern here>'); 

更下這些非常類似的問題:
Alter character field to date
Cast varchar type to date

-3

不要以爲你可以這樣做,因爲它受數據庫功能的限制。這個想法是做以下:

  • 創建一個新的列使用不同的名稱
  • 複製結束後的數據爲每行
  • 刪除原始山坳轉換列內容
  • 重命名新的山坳向原始文件夾名稱

這些步驟可以放入相同的遷移文件並保存到事務中以防萬一。

+0

當然,他可以,數據庫的功能允許它。 –

+0

你說得對,使用DB功能可以做到這一點,但它是關於使用rails。即使我們可以使用原始SQL來更改rails遷移中的數據庫列,但不知怎的,除非我們清楚地知道項目專注於某個數據庫,否則這不是一種好的做法。 –

相關問題