PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Railsy zmieniają typ kolumny i aktualizują wartości kolumn

Możesz to zrobić za jednym razem całkiem łatwo, używając klauzuli USING TABELA :

Proste rzutowanie typu SQL pozostawi cię z ciągami 'true' i 'false' więc chcesz dodać USING. Ominąłbym AR i zrobiłbym to ręcznie:

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

Ważną częścią dla Ciebie jest using case ... część na końcu. Możesz użyć tego razem ze zwykłą change_column w stylu AR rzeczy, nakłaniając AR do zrobienia właściwej rzeczy:

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

Zauważ, że używam text jako typ kolumny. Railsy będą używać varchar(255) wewnątrz bazy danych, gdy powiesz :string bez ograniczeń, jest to dość bezcelowe w PostgreSQL, ponieważ obsługuje on przechowywanie wszystkich typów łańcuchów prawie tak samo wewnętrznie , ograniczenia długości dla char(n) i varchar(n) w rzeczywistości czynią je droższymi w użyciu niż text . Wtedy tylko czas :string ma sens w przypadku PostgreSQL, gdy masz powód, aby dołączyć określony :limit (a potem text kolumna z CHECK ograniczenie długości byłoby bardziej sensowne, ale AR jest zbyt głupi, aby wiedzieć o „zaawansowanych” rzeczach, takich jak CHECK ograniczenia).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak utworzyć tablicę w PostgreSQL

  2. Prosty algorytm wyszukiwania grafów w SQL (PostgreSQL)

  3. Automatyczne zatwierdzanie w Flask-SQLAlchemy

  4. obsługa torów + postgres i strefy czasowe

  5. Jak przestawić pozycje na liście zgodnie z danym wzorem?