переключение с MySQL на PostgreSQL для Ruby on Rails ради Heroku - PullRequest
7 голосов
/ 05 января 2012

Я пытаюсь отправить совершенно новое приложение Ruby on Rails в Heroku.В настоящее время он работает на MySQL.Похоже, что Heroku на самом деле не поддерживает MySQL, и поэтому мы рассматриваем возможность использования PostgreSQL, который они поддерживают.

Насколько сложно ожидать, что это будет?Что мне нужно сделать, чтобы это произошло?

Опять же, обратите внимание, что моя БД на данный момент (как разработка, так и производство) полностью пуста.

Ответы [ 4 ]

9 голосов
/ 05 января 2012

Общие проблемы:

  1. Поведение GROUP BY. PostgreSQL имеет довольно строгий GROUP BY. Если вы используете предложение GROUP BY, то каждый столбец в вашем SELECT должен либо появляться в вашем GROUP BY, либо использоваться в статистической функции.
  2. Усечение данных. MySQL будет тихо урезать длинную строку, чтобы она поместилась внутри столбца char(n), если только ваш сервер не находится в строгом режиме, PostgreSQL будет жаловаться и заставит вас урезать свою строку самостоятельно.
  3. Цитирование отличается, MySQL использует обратные кавычки для цитирования идентификаторов, тогда как PostgreSQL использует двойные кавычки.
  4. LIKE нечувствителен к регистру в MySQL, но не в PostgreSQL. Это заставляет многих пользователей MySQL использовать LIKE в качестве оператора равенства строк без учета регистра.

(1) будет проблемой, если вы используете метод AR group в любом из ваших запросов или GROUP BY в любом необработанном SQL. Выполните поиск для column "X" must appear in the GROUP BY clause or be used in an aggregate function, и вы увидите несколько примеров и общих решений.

(2) будет проблемой, если вы будете использовать строковые столбцы в любом месте вашего приложения, и ваши модели неправильно проверяют длину всех значений входящей строки. Обратите внимание, что при создании строкового столбца в Rails без указания предела фактически создается столбец varchar(255), поэтому на самом деле существует неявный :limit => 255, даже если вы его не указали. Альтернативой является использование t.text для ваших строк вместо t.string; это позволит вам работать с произвольно большими строками без штрафа (по крайней мере, для PostgreSQL). Как отмечает Эрвин ниже (и каждый второй шанс, который он получает), varchar(n) - это анахронизм в мире PostgreSQL.

(3) не должно быть проблемой, если в вашем коде нет необработанного SQL.

(4) будет проблемой, если вы используете LIKE в любом месте вашего приложения. Вы можете исправить это, изменив a like b на lower(a) like lower(b) (или upper(a) like upper(b), если хотите кричать) или a ilike b, но учтите, что ILIKE в PostgreSQL нестандартен.

Существуют и другие различия, которые могут вызвать проблемы, но они кажутся наиболее распространенными.

Вам нужно пересмотреть несколько вещей, чтобы чувствовать себя в безопасности:

  • group звонки.
  • Необработанный SQL (включая любые фрагменты при вызовах where).
  • Проверка длины строки в ваших моделях.
  • Все виды использования LIKE.
4 голосов
/ 05 января 2012

Не думайте, что вам нужно переходить на Postgres - на Heroku доступно несколько поставщиков MySQL Addon - http://addons.heroku.com/cleardb - тот, с которым я добился наибольшего успеха

4 голосов
/ 05 января 2012

Если у вас нет данных для переноса, вам просто нужно указать Gemfile использовать pg гем вместо этого, запустить bundle install и обновить файл database.yml, чтобы он указывал на ваши базы данных PostgreSQL. Затем просто запустите миграцию (rake db:migrate), и все должно работать отлично.

0 голосов
/ 05 января 2012

Это должна быть сама простота: перенести DDL из MySQL в PostgreSQL.

Есть ли у Heroku какие-либо сценарии создания схемы? Я бы зависел от них, если бы они были доступны.

MySQL и PostgreSQL различаются (например, тип идентификации для MySQL, последовательности для PostgreSQL). Но порт не должен быть слишком жестким. Сколько столов? Десятки выполнимы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...