#mysql #ruby-on-rails #heroku
Вопрос:
У меня есть приложение Rails, которое я развернул в heroku, и я не знаю, как создать базу данных mysql для производственной среды. (База данных mysql для локальной среды уже создана без проблем.)
Вопрос 1:
Вот некоторые части конфигурации heroku. Ниже вы можете видеть, что CLEARDB_DATABASE_URL и DATABASE_URL используют один и тот же хост, но другие части отличаются. Что должно быть включено в производственную часть database.yml?
$ heroku config
=== exampleapp Config Vars
CLEARDB_DATABASE_URL:mysql://<username1>:<password1>@<host1>/<database1>?reconnect=true
DATABASE_URL:mysql2://<username2>:<password2>@<host1>/<database2>?reconnect=true
Вот моя база данных.yml. (Я включил имя пользователя, хост и пароль CLEARDB_DATABASE_URL.)
default: amp;default
pool: 5
timeout: 5000
development:
<<: *default
adapter: mysql2
database: exampleapp
pool: 5
timeout: 5000
username: root
password: xxx
host: localhost
production:
<<: *default
adapter: mysql2
database: exampleapp
username: <username1>
host: <host1>
password: <password1>
Вопрос 2:
Я запустил «heroku run rails db:миграция», но таблицы не были созданы, хотя все необходимые файлы миграции созданы в каталоге db/migrate в моем репозитории.
Когда я проверил mysql на наличие рабочей среды heroku (это правильный способ проверить ее?), вот что произошло;
$ mysql -u <username1> -p -h <host1> //username and host of CLEARDB_DATABASE_URL
$ mysql> show tables;
Empty set (0.18sec)
Если я создам таблицы с нуля здесь, используя SQL, будут ли они связаны с приложением? ( CREATE TABLE db_name.tbl_name (col_name data_type,...)
и т.д.)
У меня есть целый набор баз данных для локальной среды, поэтому было бы здорово, если бы я мог переместить таблицы с данными внутри в рабочую среду. Есть ли какие-либо способы, которыми я могу это сделать?
Ответ №1:
Для производственных систем рекомендуется извлекать информацию из базы данных из переменных среды, а не жестко их config/database.yml
кодировать . Вот почему DATABASE_URL
переменная окружения задана в Heroku. Вы можете просто получить к нему доступ вот config/database.yml
так:
production:
<<: *default
adapter: mysql2
url: <%= ENV['DATABASE_URL'] %>
Во-вторых, db:migrate
выполняет миграцию по существующей базе данных, но не создает ее. Если вы используете версию Rails более раннюю, чем 6.0, для настройки новой базы данных необходимо выполнить три задачи:
% heroku run rails db:create
% heroku run rails db:schema:load
% heroku run rails db:seed
db:create
Задачи создают базу данных, db:schema:load
инициализируют таблицы вашего приложения db/schema.rb
и db:seed
заполняют базу данных , используя все, что вы ввели db/seeds.rb
Rails 6 добавляет db:prepare
задачу, которая объединяет задачи создания в одну:
% heroku run rails db:prepare
Ответ №2:
Как упоминалось выше. Мы не должны жестко кодировать детали базы данных в коде, так как эта информация обновляется в случае обновления базы данных с помощью ClearDB. Это должно быть извлечено из переменных среды. Как и из полного URL-адреса ENV, мы можем извлечь подробную информацию, как показано ниже
require 'uri'
database_url = URI.parse(ENV['DATABASE_URL'])
user_info = database_url.userinfo.split(':')
default: amp;default
pool: 5
timeout: 5000
development:
<<: *default
adapter: mysql2
database: database_url.path[1..-1]
pool: 5
timeout: 5000
username: user_info.first
password: user_info.last
host: database_url.host
Что касается второго вопроса, можете ли вы проверить свою схему.rb. есть ли в ней все таблицы, необходимые для производства
Комментарии:
1. Большое вам спасибо за ваш комментарий!! Я научился писать database.yml с помощью ENV. И в моей схеме.rb были все необходимые таблицы. Спасибо!!