sql >> Database teknologi >  >> RDS >> Mysql

skifte fra MySQL til PostgreSQL for Ruby on Rails af hensyn til Heroku

Almindelige problemer:

  1. GRUPPER EFTER adfærd. PostgreSQL har en ret streng GROUP BY. Hvis du bruger en GROUP BY-klausul, skal hver kolonne i din SELECT enten vises i din GROUP BY eller bruges i en aggregeret funktion.
  2. Dataafkortning. MySQL vil stille og roligt afkorte en lang streng for at passe ind i en char(n) kolonne, medmindre din server er i streng tilstand, vil PostgreSQL klage og få dig til at afkorte din streng selv.
  3. Citering er anderledes, MySQL bruger backticks til at citere identifikatorer, mens PostgreSQL bruger dobbelte anførselstegn.
  4. LIKE er ufølsom mellem store og små bogstaver i MySQL, men ikke i PostgreSQL. Dette får mange MySQL-brugere til at bruge LIKE som en strengelighedsoperator, der ikke er følsom over for store og små bogstaver.

(1) vil være et problem, hvis du bruger AR's group metode i enhver af dine forespørgsler eller GROUP BY i enhver rå SQL. Søg efter column "X" must appear in the GROUP BY clause or be used in an aggregate function og du vil se nogle eksempler og almindelige løsninger.

(2) vil være et problem, hvis du bruger strengkolonner hvor som helst i din applikation, og dine modeller ikke korrekt validerer længden af ​​alle indgående strengværdier. Bemærk, at oprettelse af en strengkolonne i Rails uden at angive en grænse faktisk skaber en varchar(255) kolonne, så der faktisk er en implicit :limit => 255 selvom du ikke har angivet en. Et alternativ er at bruge t.text for dine strenge i stedet for t.string; dette vil lade dig arbejde med vilkårligt store strenge uden straf (i det mindste for PostgreSQL). Som Erwin bemærker nedenfor (og hver anden chance han får), varchar(n) er lidt af en anakronisme i PostgreSQL-verdenen.

(3) burde ikke være et problem, medmindre du har rå SQL i din kode.

(4) vil være et problem, hvis du bruger LIKE overalt i din ansøgning. Du kan rette dette ved at ændre a like b til lower(a) like lower(b) (eller upper(a) like upper(b) hvis du kan lide at råbe) eller a ilike b men vær opmærksom på, at PostgreSQL's ILIKE er ikke-standard.

Der er andre forskelle, der kan forårsage problemer, men de ser ud til at være de mest almindelige problemer.

Du bliver nødt til at gennemgå et par ting for at føle dig sikker:

  • group opkald.
  • Rå SQL (inklusive eventuelle uddrag i where opkald).
  • Strenglængdevalideringer i dine modeller.
  • Al brug af LIKE.


  1. Sådan nulstiller du WordPress Admin Password via MySQL kommandoprompt

  2. Returner en liste over fremmede nøgler i SQLite

  3. PostgreSQL :cast streng til dato DD/MM/ÅÅÅÅ

  4. Sådan opretter du et forhold i MySQL Workbench