PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Modification d'un type de colonne en chaînes plus longues dans les rails

Vous devez utiliser text avec Rails si vous voulez une chaîne sans limite de longueur. Une migration comme celle-ci :

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

faudrait arranger les choses. Vous voudrez peut-être :null => false ou d'autres options à la fin également.

Lorsque vous utilisez une string colonne sans limite explicite, Rails ajoutera un :limit => 255 implicite . Mais si vous utilisez text , vous obtiendrez le type de chaîne de longueur arbitraire pris en charge par la base de données. PostgreSQL vous permet d'utiliser un varchar colonne sans longueur mais la plupart des bases de données utilisent un type séparé pour cela et Rails ne connaît pas varchar sans longueur. Vous devez utiliser text dans Rails pour obtenir un text colonne dans PostgreSQL. Il n'y a pas de différence dans PostgreSQL entre une colonne de type text et un de type varchar (mais varchar(n) est différent). De plus, si vous déployez sur PostgreSQL, il n'y a aucune raison d'utiliser :string (AKA varchar ) du tout, la base de données traite text et varchar(n) le même en interne à l'exception des contraintes de longueur supplémentaires pour varchar(n); vous ne devez utiliser que varchar(n) (AKA :string ) si vous avez une contrainte externe (comme un formulaire gouvernemental indiquant que le champ 432 du formulaire 897/B comportera 23 caractères) sur la taille de la colonne.

En aparté, si vous utilisez une string colonne n'importe où, vous devez toujours spécifier le :limit pour vous rappeler qu'il y a une limite et que vous devriez avoir une validation dans le modèle pour vous assurer que la limite n'est pas dépassée. Si vous dépassez la limite, PostgreSQL se plaindra et déclenchera une exception, MySQL tronquera discrètement la chaîne ou se plaindra (selon la configuration du serveur), SQLite le laissera passer tel quel, et d'autres bases de données feront autre chose (probablement se plaindre) .

En outre, vous devez également développer, tester et déployer sur la même base de données (qui sera généralement PostgreSQL chez Heroku), vous devez même utiliser les mêmes versions du serveur de base de données. Il existe d'autres différences entre les bases de données (telles que le comportement de GROUP BY) dont ActiveRecord ne vous isolera pas. Vous le faites peut-être déjà, mais j'ai pensé que je devais le mentionner quand même.

Mettre à jour  :Les nouvelles versions d'ActiveRecord comprennent varchar sans limite donc, avec PostgreSQL au moins, vous pouvez dire :

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

pour changer un varchar(n) colonne en varchar . text et varchar sont toujours la même chose en ce qui concerne PostgreSQL mais certains constructeurs de formulaires les traiteront différemment :varchar obtient un <input type="text"> alors que text obtient un <textarea> multiligne .