Closed obregonia1 closed 11 months ago
ridgepole をやる
ライセンスは MIT License
$ gem install ridgepole
https://github.com/ridgepole/ridgepole#help
help の項目に $ ridgepole -h
の実行結果が載っているがコマンド自体は省略されている(不要?)
$ mkdir oss-gate
$ cd oss-gate
$ git init
config.yml 作成
adapter: mysql2
encoding: utf8
database: blog
username: root
コマンドがエラーになる
$ ridgepole -c config.yml --export -o Schemafile
/Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/3.1.0/rubygems/dependency.rb:311:in `to_specs': Error loading the 'mysql2' Active Record adapter. Missing a gem it depends on? Could not find 'mysql2' (~> 0.5) among 244 total gem(s) (LoadError)
Checked in 'GEM_PATH=/Users/kentaro/.gem/ruby/3.1.0:/Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/gems/3.1.0' , execute `gem env` for more information
from /Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/3.1.0/rubygems/dependency.rb:323:in `to_spec'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/3.1.0/rubygems/core_ext/kernel_gem.rb:62:in `gem'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/mysql2_adapter.rb:6:in `<top (required)>'
from <internal:/Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
from <internal:/Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_handler.rb:268:in `resolve_pool_config'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_handler.rb:129:in `establish_connection'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_handling.rb:52:in `establish_connection'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/gems/3.1.0/gems/ridgepole-2.0.1/lib/ridgepole/client.rb:8:in `initialize'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/gems/3.1.0/gems/ridgepole-2.0.1/bin/ridgepole:181:in `new'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/gems/3.1.0/gems/ridgepole-2.0.1/bin/ridgepole:181:in `<top (required)>'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/bin/ridgepole:25:in `load'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/bin/ridgepole:25:in `<main>'
/Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/3.1.0/rubygems/dependency.rb:311:in `to_specs': Could not find 'mysql2' (~> 0.5) among 244 total gem(s) (Gem::MissingSpecError)
Checked in 'GEM_PATH=/Users/kentaro/.gem/ruby/3.1.0:/Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/gems/3.1.0' , execute `gem env` for more information
from /Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/3.1.0/rubygems/dependency.rb:323:in `to_spec'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/3.1.0/rubygems/core_ext/kernel_gem.rb:62:in `gem'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/mysql2_adapter.rb:6:in `<top (required)>'
from <internal:/Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
from <internal:/Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_handler.rb:268:in `resolve_pool_config'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_handler.rb:129:in `establish_connection'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_handling.rb:52:in `establish_connection'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/gems/3.1.0/gems/ridgepole-2.0.1/lib/ridgepole/client.rb:8:in `initialize'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/gems/3.1.0/gems/ridgepole-2.0.1/bin/ridgepole:181:in `new'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/gems/3.1.0/gems/ridgepole-2.0.1/bin/ridgepole:181:in `<top (required)>'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/bin/ridgepole:25:in `load'
from /Users/kentaro/.asdf/installs/ruby/3.1.2/bin/ridgepole:25:in `<main>'
$ gem i mysql2
$ ridgepole -c config.yml --export -o Schemafile
[ERROR] Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
/Users/kentaro/.asdf/installs/ruby/3.1.2/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/mysql2_adapter.rb:53:in `rescue in new_client'
mysql サーバーが立ち上がってない?
$ brew services start mysql
Schemafile 作成
create_table "articles", force: :cascade do |t|
t.string "title"
t.text "text"
t.datetime "created_at"
t.datetime "updated_at"
end
rails アプリを作成
rails new oss-gate
$ cd oss-gate
$ bundle install
$ bin/rails db:create
sqlite で作ってしまったので config.yml 変更
- adapter: mysql2
+ adapter: sqlite3
$ ridgepole -c config.yml --export -o Schemafile
Export Schema to `Schemafile`
$ git add .
$ git commit -m 'first commit' -a
sqlite は使えないみたいなので rails アプリを作り直す
$ rails new oss-gate -d mysql
$ bundle install
$ bin/rails db:create
一旦 articles テーブル作成
$ rails generate migration CreateArticles
invoke active_record
create db/migrate/20231209072937_create_articles.rb
$ vi db/migrate/20231209072937_create_articles.rb
class CreateArticles < ActiveRecord::Migration[7.0]
def change
create_table :articles do |t|
t.string :title
t.text :body
t.timestamps
end
end
end
$ rails db:migrate
DB のスキーマをもとに Schemafile を生成
$ ridgepole -c config.yml --export -o Schemafile
Export Schema to `Schemafile`
$ cat Schemafile
# -*- mode: ruby -*-
# vi: set ft=ruby :
create_table "articles", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
t.string "title"
t.text "body"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
$ git add .
$ git commit -m 'first commit' -a
カラムを追加する
$ vi Schemafile
t.text 'body'
+ t.text 'author'
t.datetime 'created_at', null: false
dry-run する
$ ridgepole -c config.yml --apply --dry-run
Apply `Schemafile` (dry-run)
add_column("articles", "author", :text, **{:after=>"body", :limit=>65535})
# ALTER TABLE `articles` ADD `author` text AFTER `body`
カラムが追加されている
apply する
$ ridgepole -c config.yml --apply
Apply `Schemafile`
-- add_column("articles", "author", :text, {:after=>"body", :limit=>65535})
-> 0.0101s
sqliteは使えなさそうな雰囲気がありました。
@komagata ありがとうございます!
こう書いてあるのでMySQLとPostgreSQLのみ対応っぽいです。
なるほどー!ありがとうございます!
https://github.com/ridgepole/ridgepole#usage
例を以下のようにするとよさそう
$ cat config.yml
adapter: mysql2(or postgresql)
encoding: utf8
database: blog
username: root
https://github.com/ridgepole/ridgepole/compare/2.0...obregonia1:ridgepole:2.0 プッシュしたので description を考える
ChatGPT に訳してもらった
@obregonia1 PRのタイトルを具体的に書いた方がいいかもです。
受け取ったプロジェクトの人からすると「README修正」というPRが来たという感じになってしまうので。
以前のワークショップの時のIssue/PRなどを参考にすると良いかもです〜。 https://github.com/oss-gate/workshop/wiki/Workshop%E3%81%AE%E6%88%90%E6%9E%9C%E7%89%A92023%E2%80%9009%E2%80%9030
テーブル名をリネームしてみる
$ vi Schemafile
- create_table 'articles' do |t|
+ create_table 'user_articles', renamed_from: 'articles' do |t|
$ ridgepole -c config.yml --apply --dry-run
Apply `Schemafile` (dry-run)
rename_table("articles", "user_articles")
# RENAME TABLE `articles` TO `user_articles`
@komagata 了解しました🙆♂️
PRを受ける人の気持ちに立って考えると良いかもです。
いきなり「AAAを修正した」とだけくるといろいろ困るかもです。 元になるIssueがない場合は何故その変更が必要なのか(何が困るのか)などを丁寧に書いた方が良いと思います。
これは必須ではないですが、PRする側は変更を取り込んでもらう側なので、初めてIssueやPRを送る場合は感謝など言葉を付け加えてから始めると取り入れられやすいです。
設定ファイルの記載例にちょこっと追加するよりも、そもそも対応DBの記述をREADMEに文章で追加した方が僕らのように迷わないかもと思いました〜。
おつかれさまでした!
ワークショップの終了にともないissueを閉じますが、このまま作業メモとして使っても構いません :ok_hand:
ワークショップの感想を集めています!
ブログなどに書かれた際は、このページへリンクの追加をお願いします :pray:
またの参加をお待ちしています!
This is a work log of a "OSS Gate workshop". "OSS Gate workshop" is an activity to increase OSS developers. Here's been discussed in Japanese. Thanks.
作業ログ作成時の説明
以下のテンプレートを埋めてタイトルに設定します。埋め方例はスクロールすると見えてきます。
タイトル例↓:
OSS Gateワークショップ関連情報