Записки Вредного программиста

enjoy, motherfuckers ;)

Перенос Sqlite3 базы данных в Postgres (Heroku)

Иногда бывает крайне необходимо конвертировать имеющуюся базу данных в одном формате в формат другой. Сегодня я расскажу вам как это быстро и безболезненно (почти) сделать.

Для начала нам понадобится замечательный 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
Retrieving... done
Restoring... done

если же что-то пошло не так и вы увидели сообщение об ошибке, напишите heroku logs --ps pgbackups и вы увидите что именно пошло не так.

Надеюсь, данная заметка вам поможет перенести локальные данные на heroku или просто сделать из sqlite3 базы данных postgres или mysql.

Комментарии