読者です 読者をやめる 読者になる 読者になる

light log

学んだこととか

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://に変える。

できたらマイグレートとかする。

参考

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_tableoptions: 'DEFAULT CHARSET=utf8mb4'を付加。

で、変更をコミット、プッシュ、マイグレートする。

まとめ

一挙手一投足ハマって大変。

yamacent.hatenablog.com