PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Alterando um tipo de coluna para strings mais longas em trilhos


Você deve usar text com Rails se você quiser uma string sem limite de comprimento. Uma migração como esta:
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

deve resolver as coisas. Você pode querer :null => false ou algumas outras opções no final disso também.

Quando você usa uma string coluna sem um limite explícito, o Rails adicionará um :limit => 255 implícito . Mas se você usar text , você obterá qualquer tipo de string de comprimento arbitrário que o banco de dados suporte. PostgreSQL permite que você use um varchar coluna sem comprimento, mas a maioria dos bancos de dados usa um tipo separado para isso e o Rails não conhece varchar sem comprimento. Você tem que usar text no Rails para obter um text coluna no PostgreSQL. Não há diferença no PostgreSQL entre uma coluna do tipo text e um do tipo varchar (mas varchar(n) é diferente). Além disso, se você estiver implantando no PostgreSQL, não há motivo para usar :string (AKA varchar ), o banco de dados trata text e varchar(n) o mesmo internamente, exceto pelas restrições de comprimento extra para varchar(n); você só deve usar varchar(n) (AKA :string ) se você tiver uma restrição externa (como um formulário do governo que diz que o campo 432 no formulário 897/B terá 23 caracteres) no tamanho da coluna.

Como um aparte, se você estiver usando uma string coluna em qualquer lugar, você deve sempre especificar o :limit como um lembrete para você mesmo que existe um limite e você deve ter uma validação no modelo para garantir que o limite não seja excedido. Se você exceder o limite, o PostgreSQL irá reclamar e levantar uma exceção, o MySQL irá silenciosamente truncar a string ou reclamar (dependendo da configuração do servidor), o SQLite vai deixar passar como está, e outros bancos de dados farão outra coisa (provavelmente reclamar) .

Além disso, você também deve estar desenvolvendo, testando e implantando em cima do mesmo banco de dados (que geralmente será o PostgreSQL no Heroku), você deve usar as mesmas versões do servidor de banco de dados. Existem outras diferenças entre bancos de dados (como o comportamento de GROUP BY) das quais o ActiveRecord não o isolará. Você pode estar fazendo isso já, mas eu pensei em mencioná-lo de qualquer maneira.

Atualizar :As versões mais recentes do ActiveRecord entendem varchar sem limite então, com PostgreSQL pelo menos, você pode dizer:
change_column :your_table, :your_column, :string, limit: nil

para alterar um varchar(n) coluna para varchar . text e varchar ainda são a mesma coisa no que diz respeito ao PostgreSQL, mas alguns construtores de formulários os tratarão de maneira diferente:varchar obtém um <input type="text"> enquanto text obtém um <textarea> de várias linhas .