sql >> データベース >  >> RDS >> PostgreSQL

レール内の列タイプをより長い文字列に変更する

    textを使用する必要があります 長さ制限のない文字列が必要な場合は、Railsを使用します。このような移行:

    def up
      change_column :your_table, :your_column, :text
    end
    def down
      # This might cause trouble if you have strings longer
      # than 255 characters.
      change_column :your_table, :your_column, :string
    end
    

    物事を整理する必要があります。 :null => falseが必要な場合があります またはその最後にある他のオプションもあります。

    stringを使用する場合 明示的な制限のない列の場合、Railsは暗黙的な:limit => 255を追加します 。ただし、 textを使用する場合 、データベースがサポートする任意の長さの文字列タイプを取得します。 PostgreSQLでは、 varcharを使用できます 長さのない列ですが、ほとんどのデータベースはそのために別のタイプを使用し、Railsは varcharについて認識していません 長さなし。 textを使用する必要があります Railsでtextを取得します PostgreSQLの列。タイプtextの列間でPostgreSQLに違いはありません タイプvarcharの1つ (ただし、 varchar(n) 違う)。さらに、PostgreSQLの上にデプロイする場合は、:stringを使用する理由はありません。 (別名 varchar )まったく、データベースは textを扱います およびvarchar(n) varchar(n)の余分な長さの制約を除いて、内部的に同じです。; varchar(n)のみを使用する必要があります (別名:string )列サイズに外部制約(フォーム897 / Bのフィールド432は23文字の長さになるという政府のフォームなど)がある場合。

    余談ですが、 stringを使用している場合 列はどこでも、常に:limitを指定する必要があります 制限があることを思い出してください。制限を超えないように、モデルで検証を行う必要があります。制限を超えると、PostgreSQLは文句を言って例外を発生させ、MySQLは文字列を静かに切り捨てるか文句を言います(サーバー構成によって異なります)、SQLiteはそのまま通過させ、他のデータベースは他のことを行います(おそらく文句を言います) 。

    また、同じデータベース(通常、HerokuではPostgreSQL)上で開発、テスト、およびデプロイする必要があります。同じバージョンのデータベースサーバーを使用する必要もあります。データベース間には、ActiveRecordがユーザーを隔離しない他の違い(GROUP BYの動作など)があります。あなたはすでにこれをしているかもしれませんが、とにかくそれについて言及したいと思いました。

    更新 :ActiveRecordの新しいバージョンは varcharを理解します 制限がないので、少なくともPostgreSQLでは、次のように言うことができます。

    change_column :your_table, :your_column, :string, limit: nil
    

    varchar(n)を変更するには varcharへの列 。 テキスト およびvarchar PostgreSQLに関する限り、これは同じことですが、一部のフォームビルダーはそれらを異なる方法で処理します: varchar を取得します 一方、 text 複数行の