1

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

我发现我可以运行迁移来更改列的类型。但是,我还不想这样做,因为我不确定运行此类迁移时值会发生什么。那么该boolean值是否false会更改为“False”并将布尔值更改为true“True”?

如果不是,那么完成这项任务的最佳方法是什么?

4

2 回答 2

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

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

于 2013-01-01T03:03:13.577 回答
0

你应该没问题:

change_column :table_name, :column_name, :string

我刚刚在 9.1 上尝试过。只需备份它pg_dump test_db > test.sql

您可以在测试表上模拟 sql 以查看您的 Postgresql 版本将如何反应,rails 应该生成类似

ALTER TABLE my_table ALTER COLUMN col TYPE varchar(128);
于 2013-01-01T03:04:16.507 回答