你可能会得到'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
顺便说一句,我不得不质疑为文本列放弃布尔列的逻辑,这对我来说似乎有点倒退。