Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wechsel von MySQL zu PostgreSQL für Ruby on Rails für Heroku

Häufige Probleme:

  1. GRUPPE NACH-Verhalten. PostgreSQL hat ein ziemlich striktes GROUP BY. Wenn Sie eine GROUP BY-Klausel verwenden, muss jede Spalte in Ihrem SELECT entweder in Ihrem GROUP BY erscheinen oder in einer Aggregatfunktion verwendet werden.
  2. Datenkürzung. MySQL kürzt einen langen String leise, damit er in ein char(n) passt Wenn sich Ihr Server nicht im strikten Modus befindet, wird sich PostgreSQL beschweren und Sie dazu bringen, Ihren String selbst abzuschneiden.
  3. Das Zitieren ist anders, MySQL verwendet Backticks zum Zitieren von Bezeichnern, während PostgreSQL doppelte Anführungszeichen verwendet.
  4. LIKE unterscheidet in MySQL nicht zwischen Groß- und Kleinschreibung, aber nicht in PostgreSQL. Dies führt dazu, dass viele MySQL-Benutzer LIKE als Zeichenfolgen-Gleichheitsoperator verwenden, bei dem die Groß-/Kleinschreibung nicht beachtet wird.

(1) wird ein Problem sein, wenn Sie die group von AR verwenden -Methode in einer Ihrer Abfragen oder GROUP BY in einem beliebigen Roh-SQL. Führen Sie eine Suche nach column "X" must appear in the GROUP BY clause or be used in an aggregate function und Sie werden einige Beispiele und gängige Lösungen sehen.

(2) wird ein Problem, wenn Sie irgendwo in Ihrer Anwendung Zeichenfolgenspalten verwenden und Ihre Modelle die Länge von all nicht richtig validieren eingehende Zeichenfolgenwerte. Beachten Sie, dass das Erstellen einer Zeichenfolgenspalte in Rails ohne Angabe eines Limits tatsächlich ein varchar(255) erstellt Spalte, also gibt es tatsächlich ein implizites :limit => 255 obwohl du keinen angegeben hast. Eine Alternative ist die Verwendung von t.text für Ihre Strings anstelle von t.string; Dadurch können Sie ohne Nachteile mit beliebig großen Zeichenfolgen arbeiten (zumindest für PostgreSQL). Wie Erwin unten anmerkt (und bei jeder anderen Gelegenheit, die er bekommt), varchar(n) ist ein gewisser Anachronismus in der PostgreSQL-Welt.

(3) sollte kein Problem sein, es sei denn, Sie haben rohes SQL in Ihrem Code.

(4) wird ein Problem sein, wenn Sie LIKE irgendwo in Ihrer Anwendung verwenden. Sie können dies beheben, indem Sie a like b ändern zu lower(a) like lower(b) (oder upper(a) like upper(b) wenn du gerne schreist) oder a ilike b Beachten Sie jedoch, dass ILIKE von PostgreSQL ist kein Standard.

Es gibt andere Unterschiede, die Probleme verursachen können, aber das scheinen die häufigsten Probleme zu sein.

Sie müssen ein paar Dinge überprüfen, um sich sicher zu fühlen:

  • group Anrufe.
  • Roh-SQL (einschließlich aller Snippets in where Anrufe).
  • Validierungen der Zeichenfolgenlänge in Ihren Modellen.
  • Alle Verwendungen von LIKE.