Как создать базу данных mysql в моей рабочей среде при развертывании в Heroku

#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 были все необходимые таблицы. Спасибо!!