Используя Rails, могу ли я получить данные из устаревшей базы данных без использования ActiveRecord? - PullRequest
0 голосов
/ 11 января 2019

У меня есть новая версия веб-сайта, которая должна извлечь некоторую информацию из устаревшей версии веб-сайта. Старые и новые базы данных имеют одинаковые таблицы, поля и т. Д. На старом веб-сайте работает Rails 3. На новом веб-сайте работает Rails 5.

Я хочу вытащить некоторые записи (назовем их «Заказы») из старой базы данных в новую базу данных.

Моя первая попытка состояла в том, чтобы создать класс модели и установить соединение с помощью ActiveRecord, например:

class OldOrder < ActiveRecord::Base
  establish_connection(
    adapter:  "mysql2",
    host:     "old_server",
    username: "user",
    password: "password",
    database: "database"
  )
end

, а затем вызвать записи следующим образом:

OldOrder.where(order_number: "whatever").each do |order|
  # and so on
end

и т. Д.

К сожалению, всякий раз, когда я запускаю какую-либо команду в OldOrder, я получаю следующее сообщение об ошибке:

*** RuntimeError Exception: Your version of MySQL (5.0.77) is too old. Active Record supports MySQL >= 5.1.10.

Итак, я решил, что у меня есть два варианта: обновить mysql на старом сервере (что нежелательно из-за природы устаревшего сервера) или получить данные другим способом.

В поисках возможных ответов в StackOverflow я пытался использовать raw sql:

 sql = "Select * from ... your sql query here"
 records_array = ActiveRecord::Base.connection.execute(sql)

Но так как он использует ActiveRecord :: Base для запуска sql, это также не удалось.

Есть ли способ подключиться к этой старой базе данных в Rails без использования ActiveRecord, или я должен искать альтернативы?

Спасибо за ваше время!

1 Ответ

0 голосов
/ 14 января 2019

После комментария Дэйва Слуцкина я установил сиквел gem и подключился к старой базе данных почти таким же образом:

DB = Sequel.connect(
  adapter: :mysql2,
  host: 'old_server',
  user: 'user',
  password: 'password',
  database: 'database'
)

После этого я могу вызывать операторы для этого объекта БД практически так же, как ActiveRecord, следуя документации сиквела.

old_orders = DB[:orders]
old_orders.where(whatever: "whatever").each do |old_order|
   # Create new order
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...