cambiar de MySQL a PostgreSQL por Ruby on Rails por Heroku

Estoy tratando de empujar una nueva aplicación Ruby on Rails a Heroku. Actualmente, se encuentra en MySQL. Parece que Heroku realmente no es compatible con MySQL y por eso estamos considerando usar PostgreSQL, que sí lo son.

¿Qué tan difícil debo esperar que sea esto? ¿Qué necesito hacer para que esto suceda?

Nuevamente, tenga en cuenta que mi base de datos a partir de ahora (desarrollo y producción) están completamente vacías.

No crea que tiene que migrar a Postgres; hay varios proveedores de complementos de MySQL disponibles en Heroku: http://addons.heroku.com/cleardb es con el que he tenido más éxito.

Problemas comunes:

  1. Agrupación por comportamiento. PostgreSQL tiene un GROUP BY bastante estricto. Si usa una cláusula GROUP BY, entonces cada columna en su SELECT debe aparecer en su GROUP BY o ser usada en una función agregada.
  2. Truncamiento de datos. MySQL truncará silenciosamente una cadena larga para que quepa dentro de una columna char(n) menos que su servidor esté en modo estricto, PostgreSQL se quejará y hará que usted trunque su cadena.
  3. La cotización es diferente, MySQL usa comillas invertidas 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 utiliza el método de group de AR en cualquiera de sus consultas o GRUPO POR en cualquier SQL sin formato. La búsqueda de la 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 utiliza columnas de cadena en cualquier lugar de su aplicación y sus modelos no validan correctamente la longitud de todos los valores de cadena entrantes. Tenga en cuenta que crear una columna de cadena en Rails sin especificar un límite crea realmente una columna varchar(255) , por lo que en realidad existe un :limit => 255 implícito :limit => 255 , aunque no haya especificado ninguna. 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 señala Erwin a continuación (y en cualquier otra oportunidad que tenga), varchar(n) es un poco anacrónico en el mundo de PostgreSQL.

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

(4) será un problema si usa LIKE en cualquier lugar de su aplicación. Puede solucionar este problema cambiando a like b a lower(a) like lower(b) (o upper(a) like upper(b) si quiere gritar) o a ilike b pero tenga en cuenta que el ILIKE de PostgreSQL no es estándar.

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

Tendrá que revisar algunas cosas para sentirse seguro:

  • llamadas de group .
  • SQL en bruto (incluyendo cualquier fragmento de where llama).
  • Validaciones de longitud de cadena en tus modelos.
  • Todos los usos de LIKE.

Si no tiene datos para migrar, debería ser tan simple como decirle a su Gemfile que use la gem pg lugar, ejecutando la bundle install y actualizando su archivo database.yml para que apunte a sus bases de datos PostgreSQL. Luego simplemente ejecuta tus migraciones ( rake db:migrate ) y todo debería funcionar bien.

Debe ser la simplicidad en sí misma: trasladar el DDL de MySQL a PostgreSQL.

¿Tiene Heroku algún script de creación de esquemas? Dependería de ellos si estuvieran disponibles.

MySQL y PostgreSQL son diferentes (por ejemplo, tipo de identidad para MySQL, secuencias para PostgreSQL). Pero el puerto no debería ser demasiado duro. ¿Cuántas mesas? Las decenas son factibles.