Иногда бывает крайне необходимо конвертировать имеющуюся базу данных в одном формате в формат другой. Сегодня я расскажу вам как это быстро и безболезненно (почти) сделать.
Для начала нам понадобится замечательный gem taps и запущенный с его помощью локальный сервер с бекендом из Sinatra.
Т.к. часто создавая новый проект, не хочется особо заморачиваться и создавать для этого отдельную базу данных в Postgres, я обычно использую базу данных по умолчанинию, в рельсах это, как вам известно, sqlite. Но бывает иногда необходимо скопировать данные с локальной базы данных в удаленную, к примеру, если вы хостите проект на heroku, где по умолчанию используется postgres.
Итак, поехали, для начала создаем сервер:
taps server sqlite://db/development.sqlite3 user pass
, где user – это имя пользователя для доступа к нашему серверу (серверу taps), pass соответственно пароль.
Дальше нам нужно скопировать нашу sqlite базу данных в postgres, для этого достаточно запустить одну команду:
taps pull postgres://zudochkin@localhost/project_development http://user:pass@localhost:5000
, где postgres – это адаптер базы данных, вы можете смело использовать mysql, zudochkin – имя пользователя для postgres, project_development – имя базы данных, куда я собираюсь импортировать данные, http://user:pass@localhost:5000 – коннектимся к нашему серверу, где в качестве имени пользователя указали user, в качестве пароля pass, а крутится все это дело по умолчанию на 5000 порте.
Теперь, если зайти и посмотреть через pgAdmin в нашу postgres базу данных, то мы увидим данные, скопированные из sqlite3.
Дальше необходимо сделать postgres дамп, для того, чтобы импортировать его в heroku базу данных.
pg_dump -Fc --no-acl --no-owner -h localhost -U zudochkin project_development > project_development.dump
Загружаем дамп куда-нибудь в интернет: подойдет любой фтп или что-нибудь наподобие CloudApp, я использую последнее, потому что есть нативный клиент под Mac и он удобен в работе.
Дальше получаем URL для доступа к postgres базе данных heroku, для этого в папке с приложением выполнеяем (или из любой папке, но дописав к команде --app app_name
) heroku config | grep DATABASE_URL
и увидим длинный адрес, это и есть ссылка для доступа к БД. Если вы, как я используете cloudApp, то знайте, что, когда вы копируете ссылку на файл, это, не прямая ссылка и поэтому загрузить на heroku дамп у вас не получится, для того, чтобы увидеть реально прямую ссылку необходимо набрать следующее curl -I http://cl.ly/2h1k1X3Z2j4f/project_development.dump | grep Location
и вы увидите прямую ссылку после слова “Location: ”. Длинный и запутанный адрес это ссылка, которую вам дал cloudApp для доступа к файлу.
После этих манипуляций давайте запустим импорт базы данных из папки с проектом heroku pgbackups:restore DATABASE 'http://f.cl.ly/items/4G2u393d432U3V0u2X1d/project_development.dump'
если все прошло нормально, то мы увидим
1 2 |
|
если же что-то пошло не так и вы увидели сообщение об ошибке, напишите heroku logs --ps pgbackups
и вы увидите что именно пошло не так.
Надеюсь, данная заметка вам поможет перенести локальные данные на heroku или просто сделать из sqlite3 базы данных postgres или mysql.