HerokuでMySQLを使うためにいろいろした
いろいろしたのでメモしておく。
そこら中の有益な記事を参考にした。
ClearDBアドオンの追加
HerokuのデフォルトのDBはPostgreSQLなので、MySQLを使うためにClearDBアドオンを入れる。
$ heroku addons:create cleardb:ignite
環境変数を設定する。
$ heroku config | grep CLEARDB_DATABASE_URL CLEARDB_DATABASE_URL: mysql://<username>:<password>@<host>/<databse>?reconnect=true $ heroku config:set DATABASE_URL='mysql2://<username>:<password>@<host>/<database>?reconnect=true'
何をやってるかというと、ClearDBアドオンを入れると追加されるCLEARDB_DATABASE_URL
の値を、DATABASE_URL
の値にセットしている。その際、スキームをmysql://
からmysql2://
に変える。
できたらマイグレートとかする。
参考
- Heroku データベースの管理(ClearDB アドオンによる MySQL の利用) - 君の瞳はまるでルビー - Ruby 関連まとめサイト
- Heroku (Rails) で MySQL 使う。 - Qiita
Rails外からDBにアクセスする
以上の設定でRailsアプリからはMySQLにアクセスできた。(たしか)
しかし今回はDBにレコードを定期的に追加するスクリプトをHeroku Schedulerで走らせていて、そいつからもアクセスできるようにする必要がある。(スクリプトではActiveRecordを使ってる)
そのスクリプトに設定をハードコーディングしたり独自の設定ファイルを別に用意したくないので、Railsのdatabase.ymlを読み込んで使うことにする。
最初に自動生成されたdatabase.ymlにこう書いてある。
# On Heroku and other platform providers, you may have a full connection URL # available as an environment variable. For example: # # DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase" # # You can use this database configuration with: # # production: # url: <%= ENV['DATABASE_URL'] %>
ので、こうする。
production: <<: *default url: <%= ENV['DATABASE_URL'] %>
その上で、DBにアクセスしたいスクリプト側はこうした。
require 'active_record' require 'yaml' require 'erb' ... env = ENV['RAILS_ENV'] ||= 'development' CONFIG = YAML.load( ERB.new(File.read( File.expand_path('path/to/database.yml', __FILE__) )).result)[env] ActiveRecord::Base.establish_connection(CONFIG)
参考
文字コード
上で動かしはじめると、
Mysql2::Error: Incorrect string value:...
というエラーが出た。
絵文字を格納するには、MySQLのエンコードをutf8mb4にする必要があるとのこと。(デフォルトはutf8)
参考:ClearDB に文字コード utf8mb4 で保存する - xykのブログ
この記事に従って、まず環境変数の修正を行う。
$ heroku config:set DATABASE_URL="mysql2://<username>:<password>@<host>/<database>?reconnect=true&encoding=utf8mb4"
DATABASE_URL
の末尾に&encoding=utf8mb4
を付加。
次に、マイグレーションファイルを以下の通り修正する。
class CreateUsers < ActiveRecord::Migration def change create_table :users, options: 'DEFAULT CHARSET=utf8mb4' do |t| ... end end end
create_table
にoptions: 'DEFAULT CHARSET=utf8mb4'
を付加。
で、変更をコミット、プッシュ、マイグレートする。
まとめ
一挙手一投足ハマって大変。
プロフェッショナルのための 実践Heroku入門 プラットフォーム・クラウドを活用したアプリケーション開発と運用 (書籍)
- 作者: 相澤歩,arton,鳥井雪,織田敬子
- 出版社/メーカー: KADOKAWA/アスキー・メディアワークス
- 発売日: 2014/09/19
- メディア: 大型本
- この商品を含むブログ (2件) を見る