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

passer de MySQL à PostgreSQL pour Ruby on Rails pour le bien d'Heroku

Problèmes courants :

  1. Comportement GROUPER PAR. PostgreSQL a un GROUP BY plutôt strict. Si vous utilisez une clause GROUP BY, chaque colonne de votre SELECT doit soit apparaître dans votre GROUP BY, soit être utilisée dans une fonction d'agrégation.
  2. Troncation des données. MySQL tronquera discrètement une longue chaîne pour tenir dans un char(n) à moins que votre serveur ne soit en mode strict, PostgreSQL se plaindra et vous obligera à tronquer votre chaîne vous-même.
  3. La citation est différente, MySQL utilise des backticks pour citer les identifiants alors que PostgreSQL utilise des guillemets doubles.
  4. LIKE est insensible à la casse dans MySQL mais pas dans PostgreSQL. Cela conduit de nombreux utilisateurs de MySQL à utiliser LIKE comme opérateur d'égalité de chaîne insensible à la casse.

(1) sera un problème si vous utilisez le group d'AR méthode dans l'une de vos requêtes ou GROUP BY dans n'importe quel SQL brut. Faites une recherche pour column "X" must appear in the GROUP BY clause or be used in an aggregate function et vous verrez des exemples et des solutions courantes.

(2) sera un problème si vous utilisez des colonnes de chaîne n'importe où dans votre application et que vos modèles ne valident pas correctement la longueur de tous valeurs de chaîne entrantes. Notez que la création d'une colonne de chaîne dans Rails sans spécifier de limite crée en fait un varchar(255) colonne donc il y a en fait un :limit => 255 implicite même si vous n'en avez pas spécifié. Une alternative consiste à utiliser t.text pour vos chaînes au lieu de t.string; cela vous permettra de travailler avec des chaînes arbitrairement grandes sans pénalité (pour PostgreSQL au moins). Comme le note Erwin ci-dessous (et toutes les autres chances qu'il a), varchar(n) est un peu un anachronisme dans le monde PostgreSQL.

(3) ne devrait pas poser de problème à moins que vous n'ayez du SQL brut dans votre code.

(4) sera un problème si vous utilisez LIKE n'importe où dans votre application. Vous pouvez corriger celui-ci en changeant a like b à lower(a) like lower(b) (ou upper(a) like upper(b) si vous aimez crier) ou a ilike b mais sachez que ILIKE de PostgreSQL n'est pas standard.

Il existe d'autres différences qui peuvent causer des problèmes, mais celles-ci semblent être les problèmes les plus courants.

Vous devrez revoir quelques éléments pour vous sentir en sécurité :

  • group appels.
  • SQL brut (y compris tous les extraits dans where appels).
  • Validations de longueur de chaîne dans vos modèles.
  • Toutes les utilisations de LIKE.