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

passando da MySQL a PostgreSQL per Ruby on Rails per il bene di Heroku

Problemi comuni:

  1. Comportamento GRUPPO PER. PostgreSQL ha un GROUP BY piuttosto rigoroso. Se utilizzi una clausola GROUP BY, ogni colonna nel tuo SELECT deve apparire nel tuo GROUP BY o essere utilizzata in una funzione aggregata.
  2. troncamento dei dati. MySQL troncherà silenziosamente una lunga stringa per adattarla a un char(n) colonna a meno che il tuo server non sia in modalità rigorosa, PostgreSQL si lamenterà e ti farà troncare tu stesso la tua stringa.
  3. Le virgolette sono diverse, MySQL usa i backtick per citare gli identificatori mentre PostgreSQL usa le virgolette doppie.
  4. LIKE non fa distinzione tra maiuscole e minuscole in MySQL ma non in PostgreSQL. Questo porta molti utenti MySQL a usare LIKE come operatore di uguaglianza di stringhe senza distinzione tra maiuscole e minuscole.

(1) sarà un problema se utilizzi il group di AR metodo in una qualsiasi delle tue query o GROUP BY in qualsiasi SQL grezzo. Fai qualche ricerca per column "X" must appear in the GROUP BY clause or be used in an aggregate function e vedrai alcuni esempi e soluzioni comuni.

(2) sarà un problema se utilizzi colonne di stringa in un punto qualsiasi della tua applicazione e i tuoi modelli non convalidano correttamente la lunghezza di tutti valori di stringa in entrata. Nota che la creazione di una colonna stringa in Rails senza specificare un limite crea effettivamente un varchar(255) colonna quindi c'è effettivamente un implicito :limit => 255 anche se non ne hai specificato uno. Un'alternativa è usare t.text per le tue stringhe invece di t.string; questo ti permetterà di lavorare con stringhe arbitrariamente grandi senza penalità (almeno per PostgreSQL). Come osserva Erwin di seguito (e ogni altra possibilità che ha), varchar(n) è un po' un anacronismo nel mondo PostgreSQL.

(3) non dovrebbe essere un problema a meno che tu non abbia SQL grezzo nel tuo codice.

(4) sarà un problema se stai usando LIKE ovunque nella tua applicazione. Puoi risolverlo cambiando a like b a lower(a) like lower(b) (o upper(a) like upper(b) se ti piace gridare) o a ilike b ma tieni presente che ILIKE di PostgreSQL non è standard.

Esistono altre differenze che possono causare problemi, ma questi sembrano essere i problemi più comuni.

Dovrai rivedere alcune cose per sentirti al sicuro:

  • group chiamate.
  • SQL non elaborato (inclusi eventuali snippet in where chiamate).
  • Convalide della lunghezza delle stringhe nei tuoi modelli.
  • Tutti gli usi di LIKE.