2013-01-01 43 views
1

我的Rails 3.2.8应用程序有一个数据库表作为PostgreSQL数据库。在这个数据库中,我有一个类型为boolean的列。该列的值已填入。我想将值从boolean更改为所有字符串。在Rails 3.2.8中更改PostgreSQL数据库中整个列的数据类型

我发现我可以运行迁移来更改列的类型。但是,我不想这样做,因为我不确定在执行此类迁移时值会发生什么情况。那么boolean的值false会变成“False”,而布尔true变成“True”?

如果不是,那么完成此任务的最佳方式是什么?

+0

这是一个生产数据库? –

+0

没有它的开发数据库 – banditKing

回答

3

你可能会得到'true''false'

psql> create table t (c boolean not null); 
psql> insert into t (c) values (TRUE), (FALSE); 
psql> alter table t alter column c type text; 
psql> select * from t; 
    c 
------- 
true 
false 

我不知道是否有保证,我找不到什么是布尔文本投不这样你可能要一个权威的参考检查一下这些在你的版本的PostgreSQL说:

psql> select TRUE::text; 
psql> select FALSE::text; 

如果你想保证'True''False',那么你可以使用USING手动指定转换:

可选USING子句指定如何从旧计算新列值;如果省略,则默认转换与从旧数据类型到新转换的赋值相同。

所以,你可以说这给力的问题:,

alter table t 
alter column c type text 
using case c when TRUE then 'True' when FALSE then 'False' else NULL end 

如果让Rails的做一个标准的迁移转化,那么你将得到默认的布尔到文本蒙上如果您使用SQL ALTER TABLE手动更改类型,然后可以控制发生的情况。你可以做任何一个迁移内部:

def up 
    change_column :t, :c, :text 
end 

def up 
    connection.execute(%q{ 
     alter table ... 
    }) 
end 

顺便说一句,我不得不质疑放弃为文本列布尔列的逻辑,似乎有点倒退到我。

0

您应该罚款:

change_column :table_name, :column_name, :string 

我只是刚在9.1。刚刚复出它pg_dump test_db > test.sql

你可以模拟SQL上的一个测试表,看看你的PostgreSQL的版本会发生反应,轨应该产生类似

ALTER TABLE my_table ALTER COLUMN col TYPE varchar(128); 
相关问题