Rails7系のMySQLアダプターのgemを”mysql2″から”trilogy”に変更する方法。DATABASE_URLのプロトコルをmysql2からtrilogyに変更しよう。

りーずです。

Rails7系のMySQLアダプターのgemを”mysql2″から”trilogy”に変更する方法です。

Dockerを使ってRails7とMySQLの環境を構築済みという前提でのお話です。

ちょっと(凡ミスで)ハマった部分もあったので、そこも記述します。

環境:Rails7.0.8 Ruby 3.2.0 MySQL 5.7をDocker環境で構築。

まず、Gemfileを変更する

# Use mysql as the database for Active Record
# gem 'mysql2', '~> 0.5'
gem 'trilogy'
gem 'activerecord-trilogy-adapter'

Rails7.0.x系の場合は上記のように、 mysql2のgemを消して、

gem 'trilogy'
gem 'activerecord-trilogy-adapter'

を入れます。

(ちなみにRails7.1.x系~の場合は gem activerecord-trilogy-adapter はRails7に含まれるので不要です。以下参考。)

⚠️ Rails v7.1+ includes Trilogy support by default making this gem unnecessary

引用:https://github.com/trilogy-libraries/activerecord-trilogy-adapter#trilogy-adapter

database.ymlのadapterをtrilogyに変更する

database.ymlのadapterがmysql2になっていた部分をtrilogyに変更します。

default: &default
  adapter: trilogy
  encoding: utf8mb4

 

docker compose buildしてDBの疎通確認、アプリの動作確認をする

あとは docker compose build --no-cache をしてコンテナをビルドし直せば完了です。
DBが動いているか、ローカルのテスト等が通って問題がなさそうなら本番環境にデプロイしましょう。

少しハマった部分。本番環境では環境変数のDATABSE_URLのプロトコル「mysql2」を「trilogy」に変更しよう

本番環境での環境変数の設定画面

本番環境での環境変数の設定画面(画像はrender.comの場合)

本番環境の環境変数(僕の場合はrender.comのEnvironment)でDATABASE_URLを
[プロトコル]://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?[クエリパラメータ]
のように設定しているはずですが、gem mysql2を使っていた場合はプロトコルの部分がmysql2になっているはずです。

mysql2://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?[クエリパラメータ]

これをそのままにしていると

/usr/local/lib/ruby/site_ruby/3.2.0/bundler/rubygems_integration.rb:237:in `block (2 levels) in replace_gem': Error loading the 'mysql2' Active Record adapter. Missing a gem it depends on? mysql2 is not part of the bundle. Add it to your Gemfile. (LoadError)

のようなエラーがアプリ側で出てデプロイに失敗するはずです。

なので、「mysql2」の部分を 「trilogy」に変更しましょう。

trilogy://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?[クエリパラメータ]

のような形になるはずです。

これで動作しました。

Active Recordも動きますし、サニタイズ処理やkaminari(ページネーションのgem)なども従来どおり普通に動作しています。

追記:
その後、一旦 mysql2に戻しました。
MySQL5.7なら良かったのですが、ConoHaのDBのMySQLのバージョンがMySQL8.0だったため
こちらの点 を考慮する必要があり、database.ymlが結構変わってしまうので戻しました。

  MySQL8.0でデフォルトの認証となったcaching_sha2_passwordだと疎通できなかったので、
native_password方式で動かす必要があった。
関連ISSUE: https://github.com/github/trilogy/issues/26

引用:https://zenn.dev/link/comments/ae5450e04b62e9

 

つまり、 database.ymlで DATABASE_URL を使えず、username, password, host などを1つ1つの要素に分けて記述する必要がある ということらしいです。
(それらを環境変数で設定するのはOK)

これはちょっと面倒なので、MySQL8.0でもDATABASE_URL を使える mysql2 に今の時点では戻した感じです。アップデートで trilogy でも DATABASE_URL形式が使えるようになれば良いですね。

以上、なにかの参考になれば幸いです。

参考記事:
「RailsでTrilogyを試す」
https://zenn.dev/son_h/scraps/8282306d8e9982

「Ruby on Rails 7.1の主要な新機能・機能追加・変更点」
https://qiita.com/ryohashimoto/items/ed669f2e529d489e9fe4#trilogy-mysql%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%81%AE%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88

Googleの広告(アドセンス)を一時止めました。

どうも、りーずです。

このブログに表示される広告はGoogleのアドセンス広告を使っていたんですが、割に合わないな~と思うことが結構あるので一旦広告の表示を止めました。

広告ってもちろん記事を見ているときに出てくるんですが、
・そこから(広告への)離脱が起きると割に合わない
・(オーバーレイ広告を許可している場合)記事が見にくくなる
・広告単価がかなり安い
などなどがあります。
(ちなみにオーバーレイ広告はオフにもできます。)

よりWin-WinなのはAmazonアソシエイトで、自分が最近買って良かったものを純粋に書いて自分のよいものを広めるのが一番だな~などと思っています。

自分にとってブログ運営は自己満足や趣味のようなものなので、運営費用(サーバー代、ドメイン代)を回収できるかできないかギリギリのところで動いている感じですね。
というかGoogleアドセンスを停止したらたぶん普通にマイナスになります。

まぁそういう感じですが、このブログは自分自身でもソフトウェアやVSTインストゥルメントの備忘録などでブログを検索したりして使うことが多いので、より快適になるように広告は消したというのが一番かもしれません。

まぁ上にバナーが1つ表示されるくらいだとブログっぽいのでそのくらいなら良いかなとも思いますけどね。気まぐれに復活するかもしれません。

ぼちぼち更新していきますのでどうぞよろしくお願いします。

Dockerで開発するRuby on Railsアプリで、マイグレーションファイルを作りマイグレーションを実行する方法。ユニークインデックスを追加する。

Dockerでマイグレーションファイルを作成し、マイグレーションを実行する方法です。

 

Railsのバージョンは7.0.4 / Ruby 3.2.0です
今回は、カラムにユニークインデックスを追加します。

 

まず最初にdockerデスクトップアプリを起動します。
その次にマイグレーションファイルを作成。

docker compose run web bundle exec rails g migration ファイル名

web の部分はdockerでアプリケーションをどういう名前にしているかによりますが僕の場合はwebです。

ファイル名は何をしているかが分かると良いので
docker compose run web bundle exec rails g migration add_unique_index_to_videos

というようにします。

これでひな形の


lass AddUniqueIndexToVideos < ActiveRecord::Migration[7.0]
  def change
  end
end

このようなファイルが作成されたと思うので、中に記述していきます。

今回はユニークインデックスをカラムに追加するので


add_index :テーブル名, :カラム名, unique: true

というようにします。

テーブル名は小文字で複数形、カラム名はそのままです。

全体では


lass AddUniqueIndexToVideos < ActiveRecord::Migration[7.0]
  def change
    add_index :テーブル名, :カラム名, unique: true
  end
end

このようになります。

そうしたら、マイグレーションコマンド


docker compose run web bundle exec rails db:migrate

でマイグレーションを行います。

 

ちなみにロールバックは


docker compose run web bundle exec rails db:rollback

これで出来るので、ロールバックしてみてデータベースのテーブルの設定が元の状態に戻るか確かめます。僕はHeidiSQLというアプリで接続して試すことが多いです。

1つずつバージョン番号を指定してロールバックしたい場合は


docker compose run web bundle exec rails db:migrate:status

コマンドでマイグレーションの状態を調べて、バージョン番号を確認します。


# 特定のマイグレーションを実行したい場合
docker compose run web bundle exec rails db:migrate:up VERSION=バージョン番号
# 特定のマイグレーションをロールバックしたい場合
docker compose run web bundle exec rails db:migrate:down VERSION=バージョン番号

テスト用にDBを同期したい場合は


docker compose exec spring bin/rails db:test:prepare

を実行します。(忘れやすいので注意)

これで大丈夫そうならOKです。

git add .
git commit -m "マイグレーションファイルの作成とマイグレーション実行"
git push origin main

のようにして、gitでpushしましょう。

また、render.comの場合はマイグレーションを実行環境のシェルで行う必要があるので
ブラウザの設定画面でシェルに接続して


rails db:migrate

と打つと、デプロイされた環境でマイグレーションが実行されます。

【おまけ】
ちなみにマイグレーションでnull: falseにした場合は
downにnull: trueを記述しないとロールバックで元に戻らないので、upとdownを明示してあげます。

(例)


class ChangeCollationOfVideosTitle < ActiveRecord::Migration[7.0]
  def up
    change_column :videos, :title, :string, collation: "utf8mb4_bin", null: false
  end

  def down
    change_column :videos, :title, :string, collation: "utf8_bin", null: true
  end
end

以上です。

何かの参考になれば幸いです。

Docker環境でPythonを動かす

「DockerでPython実行環境を作ってみる」
https://qiita.com/jhorikawa_err/items/fb9c03c0982c29c5b6d5

こちらの記事を参考にしました。

用意するもの

docker-env1/
  ├ Dockerfile
  ├ docker-compose.yml
  └ opt/
    └ sample.py

という構成。
環境はいくつか作ると思うので
evn1 env2 env3のように番号をふることにします。(命名は自由です)

それぞれファイルを作る

Dockerfile

FROM python:3
USER root

RUN apt-get update
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

RUN apt-get install -y vim less
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools

RUN python -m pip install jupyterlab

 

docker-compose.yml

version: '3'
services:
  python3:
    restart: always
    build: .
    container_name: 'python3'
    working_dir: '/root/'
    tty: true
    volumes:
      - ./opt:/root/opt

 

sample.py

import math
import sys

def main():
  val = float(sys.argv[1])
  print(math.radians(val))

if __name__ == "__main__":
  main()

これだけ。

 

あとはプロジェクトルートに入り、

docker-compose up -d --build

を実行。

そのあとにVisualStudioCodeのターミナルで

docker-compose exec python3 bash

を実行する。これでDocker上で起動している仮想Linuxのコンソールに入れる。

自分の場合は、なぜかWindows PowerShellでは上のコマンドが実行できなかったので注意。VSCodeのターミナルを使いましょう。

※個人の環境設定に起因するものかもしれません。

あとはそのターミナルでLinux内部に入っている状態になるので、sample.pyがあるフォルダ(optフォルダ)にcdコマンドで入ります。

そして

python sample.py 180.0

のようにコマンドを打つと、sample.py が実行されて円周率が出るはずです。

これで仮想Linux上でのPython環境をWindows上で構築できるというのは魅力的ですね。

以上、自分用のメモでした。

XP-PENの液タブの設定が再起動時に保存されていない場合の対処法。 設定アプリ「Pentablet」でOKを押そう

どうも、りーずです。

最近液晶ペンタブレットのArtist 13.3 PROを購入したのですが、設定が保存されないという場合がありました。

これの対処方法です。

結論、設定ソフトウェアの「Pentablet」で左下の「OK」を設定変更後に押せば設定が保存されます。

これが意外と押し忘れてそのまま使って、次回の起動時に設定が保存されていない、という事があったので、備忘録として書いておきます。

画像参照。設定画面の左下の目立たないところに「OK」「キャンセル」とありますね。

ここで「OK」を押せば保存されます。

左下の「OK」を押さないと次回PC起動時に設定が保存されない。

以上、何かの参考になれば幸いです。

 

※上のリンクはAmazonアソシエイトリンクを使用しています。