2

私はいつでも自分の開発データベース (PostgreSQL) を無効にして再構築する危険を冒すことができましたが、最初に誰かに経験があるかどうかを確認することにしました。

理想的には、すべてのデータがその整数値に切り捨てられます: (例: 5.7 は 5 になります) またはおそらく値は丸められます (5.7 は 6 になります)? それとも、単にすべての値を無効にするかゼロにするだけで、データが失われるのでしょうか? 最悪の結果は信頼できないデータになると思います (5.7 が 23 になります)。

この種の移行に一般的な経験則はありますか?

class ChangeBookFromDecimalToInteger < ActiveRecord::Migration
  def self.up
   change_column :book, :price, :integer
  end

  def self.down
   change_column :book, :price, :decimal
  end
end
4

3 に答える 3

7

ActiveRecord は ALTER TABLE ALTER COLUMN ... TYPE をデータベースに送信し、データベースは型変換を実行します。PostgreSQL は次を使用するように変換decimalされます。intround

=> create table with_decimal (n decimal(11, 6));
=> insert into with_decimal (n) values (1.0),(1.1),(1.5),(1.6),(1.9);
=> insert into with_decimal (n) values (-1.0),(-1.1),(-1.5),(-1.6),(-1.9);
=> select * from with_decimal;
     n     
-----------
  1.000000
  1.100000
  1.500000
  1.600000
  1.900000
 -1.000000
 -1.100000
 -1.500000
 -1.600000
 -1.900000
(10 rows)

=> alter table with_decimal alter column n type int;
=> select * from with_decimal;
 n  
----
  1
  1
  2
  2
  2
 -1
 -1
 -2
 -2
 -2
(10 rows)

round(numeric)最も近い整数に丸められることに注意してください。

特定の変換動作が必要な場合は、ALTER TABLEで USING を指定する必要があります。

オプションのUSING句は、古い列の値から新しい列の値を計算する方法を指定します。省略した場合、デフォルトの変換は、古いデータ型から新しいデータ型への代入キャストと同じです。USING古い型から新しい型への暗黙のキャストまたは代入キャストがない場合は、句を指定する必要があります。

USING 句が必要な場合、ActiveRecord は USING について何も知らないため、手動で ALTER TABLE を発行する必要があります。次に例を示します。

def up
    connection.execute(%q{
        alter table books
        alter column price 
        type integer
        using trunc(price * 100)
    })
end
于 2013-01-19T20:39:09.710 に答える
0

「ALTERTABLE...CHANGE COLUMN ...」などのクエリの処理方法と、対応するタイプ間でデータを変換する方法については、PostreSQLのマニュアルを参照する必要があります。
RailsでのすべてのDBスキーマ変更の移行は、対応するデータベースバックエンドによって処理されます。

于 2013-01-19T20:20:30.550 に答える
0

一般的な経験則では、移行する必要があり、明示的な要件が必要な場合は、新しい列を作成し、Ruby を使用して列を変換してから、古い列を削除します。データを気にしない場合は、DBにそれをさせてくださいALTER TABLE

于 2013-01-19T20:38:35.440 に答える