web-dev-qa-db-ja.com

Rails文字列を整数に変換するための移行?

すでに入力されているデータをクリアせずに、文字列であるフィールドを整数に変更することは可能ですか?

問題のテーブルの現在のdb構造は次のとおりです。

create_table :people do |t|
t.string :company_id

これは移行を使用して可能ですか?

移行時に古いフィールドを削除し、整数である新しいフィールドを作成することを考えています。しかし、これにより、すでに入力されているすべてのデータが消去されるのではないかと心配しています。

ありがとう、

ダニー

30
dannymcc

列を削除しないでください。データが消去されます。

ただし、試すことはできます

change_column :people, :company_id, :integer

company_idのすべての値をintegerに変換できる場合は、問題ないはずです。

そうでない場合(つまり、デフォルトですべての文字列を変換できるわけではない場合)、2つのステップで実行できます。1)新しい列を作成し、変換後にそこにcompany_idをロードします。 2)company_idをドロップしてから、新しい列の名前を変更します。

両方の方法に注意する必要があります(2番目の方法の場合はさらに注意してください)。可能であれば、おそらくデータベースのコピーに対して最初に行う必要があります。

33
Zaki

列をドロップしないでください、これを使用してください

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'

PostgreSQLから得た「ヒント」は、基本的に、これを実現するかどうか、およびデータをどのように変換するかを確認する必要があることを示しています。変更を確認するには、移行で上記のブロックを使用します

43
user3402754

他の答えは正しいですが、:usingキーワードを使用してさらに一歩進めることができます。

change_column :people, :company_id, :integer, using: 'company_id::integer'
33
João Souza