1

Rails3.2.8アプリのDBテーブルをPostgreSQLデータベースとして持っています。このDBには、タイプの列がありますboolean。列に値が入力されています。値をbooleanからすべての文字列に変更したいと思います。

移行を実行して列のタイプを変更できることがわかりました。ただし、このような移行を実行すると値がどうなるかわからないため、まだこれを実行したくありません。では、booleanfalseは「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

それが保証されているかどうかはわかりませんし、ブール値からテキストへのキャストが何をするかについての信頼できる参照も見つかりません。

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

'True'保証したい場合は、 USING'False'を使用して手動で変換を指定できます。

オプションの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のバージョンがどのように反応するかを確認できます。レールは次のようなものを生成する必要があります

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