sql >> Base de Datos >  >> RDS >> Mysql

cambiar de MySQL a PostgreSQL para Ruby on Rails por el bien de Heroku

Problemas comunes:

  1. Comportamiento GROUP BY. PostgreSQL tiene un GRUPO POR bastante estricto. Si usa una cláusula GROUP BY, entonces cada columna en su SELECT debe aparecer en su GROUP BY o usarse en una función agregada.
  2. Truncamiento de datos. MySQL truncará silenciosamente una cadena larga para que quepa dentro de un char(n) a menos que su servidor esté en modo estricto, PostgreSQL se quejará y hará que usted mismo trunque su cadena.
  3. Las citas son diferentes, MySQL usa acentos graves para citar identificadores, mientras que PostgreSQL usa comillas dobles.
  4. LIKE no distingue entre mayúsculas y minúsculas en MySQL pero no en PostgreSQL. Esto lleva a muchos usuarios de MySQL a usar LIKE como un operador de igualdad de cadenas que no distingue entre mayúsculas y minúsculas.

(1) será un problema si usa el group de AR en cualquiera de sus consultas o GROUP BY en cualquier SQL sin procesar. Realice una búsqueda de column "X" must appear in the GROUP BY clause or be used in an aggregate function y verá algunos ejemplos y soluciones comunes.

(2) será un problema si usa columnas de cadena en cualquier parte de su aplicación y sus modelos no validan correctamente la longitud de todo valores de cadena entrantes. Tenga en cuenta que crear una columna de cadena en Rails sin especificar un límite en realidad crea un varchar(255) columna por lo que en realidad hay un implícito :limit => 255 aunque no haya especificado uno. Una alternativa es usar t.text para sus cadenas en lugar de t.string; esto le permitirá trabajar con cadenas arbitrariamente grandes sin penalización (al menos para PostgreSQL). Como Erwin señala a continuación (y cada otra oportunidad que tiene), varchar(n) es un poco anacrónico en el mundo de PostgreSQL.

(3) no debería ser un problema a menos que tenga SQL sin procesar en su código.

(4) será un problema si está utilizando LIKE en cualquier parte de su aplicación. Puedes arreglar esto cambiando a like b a lower(a) like lower(b) (o upper(a) like upper(b) si te gusta gritar) o a ilike b pero tenga en cuenta que ILIKE de PostgreSQL no es estándar.

Hay otras diferencias que pueden causar problemas, pero esos parecen ser los problemas más comunes.

Tendrás que revisar algunas cosas para sentirte seguro:

  • group llamadas.
  • SQL sin formato (incluidos los fragmentos en where llamadas).
  • Validaciones de longitud de cadena en sus modelos.
  • Todos los usos de LIKE.