sql >> Databáze >  >> RDS >> PostgreSQL

Kolejnice mění typ sloupce a aktualizují hodnoty sloupců

Můžete to udělat jedním tahem docela snadno pomocí klauzule USING ALTER TABULKA :

Jednoduché přetypování typu SQL by vám zanechalo řetězce 'true' a 'false' takže chcete přidat POUŽÍVÁNÍ. AR bych obešel a udělal to ručně:

connection.execute(%q(
  alter table users
  alter column active
  type text
  using case when active then 'active' else 'inactive' end
))

Důležitou součástí pro vás je using case ... část na konci. Můžete jej použít společně s obvyklým change_column v AR-ish přimět AR, aby udělal správnou věc:

class ChangeColumnTypeInUsers < ActiveRecord::Migration
  def up
    change_column :users, :active, "text using case when active then 'active' else 'inactive' end"
  end

  def down
    change_column :users, :active, "boolean using active = 'active'"
  end
end

Všimněte si, že používám text jako typ sloupce. Rails bude používat varchar(255) uvnitř databáze, když řeknete :string bez omezení je to s PostgreSQL docela zbytečné, protože zpracovává úložiště pro všechny typy řetězců v podstatě stejně interně , omezení délky pro char(n) a varchar(n) ve skutečnosti je jejich použití dražší než text . Pak už jen čas :string dává smysl u PostgreSQL je, když máte důvod zahrnout konkrétní :limit (a poté text sloupec s CHECK omezení délky by dávalo větší smysl, ale AR je příliš hloupý na to, aby věděl o "pokročilých" věcech, jako je CHECK omezení).



  1. MySQL - vytvoření uživatelem definované funkce pro vlastní řazení

  2. Jak získat přístup k vestavěné šabloně CRM v aplikaci Microsoft Access

  3. Jak získat pouze první úroveň podřízených uzlů hloubky?

  4. Nelze vytvořit instanci poskytovatele OLE DB Microsoft.Jet.OLEDB.4.0 pro propojený server null