Googleが提供しているオープンソースのツールで、ORMが生成するSQLの調査を容易にしてくれるらしいので使ってみました。
具体的にはログなどに、コメントが含まれるようになり、ORMが生成したSQL文はどのコードで生成されたものかを知ることができるみたいです。
今回Rails APIモードのデモアプリケーションが用意されているので、どのようなコメントが出力されるか動かして確認してみます。
google/sqlcommenter | GitHub
sqlcommenterが対応する言語、フレームワーク、DBは以下
言語
- Ruby
- Python
- JavaScript
- Node.js
- Java
フレームワーク
- Ruby on Rails
- Flask
- Django
- Express
- Knex.js
- etc...etc
DB
- MySQL
- MariaDB
- PostgreSQL
- SQLite
- Google Cloud SQL
デモRailsアプリケーションで試してみる
google/sqlcommenter | Rails demo
RailsのAPIデモアプリケーションでとりあえずsqlcommenterがどんなものかを体験ができるみたいです。
ただ、sqlcommenter_railsはrubygemsではリリースされていないようなので、上記のREADMEの手順に沿って環境構築すればとりあえずは使うことができます。
APIは以下の2つが用意されています。
- Get /posts
- POST /posts
APIを叩くcurl
curl localhost:3000/posts
curl -X POST localhost:3000/posts -d 'title=my-post'
POST /postsを実行
curl -X POST localhost:3000/posts -d 'title=my-post'
INSERT INTO "posts" ("title", "created_at", "updated_at") VALUES (?, ?, ?)
/*action='create',application='SqlcommenterRailsDemo',controller='posts',db_driver='ActiveRecord::ConnectionAdapters::SQLite3Adapter',
framework='rails_v6.0.3.5',route='/posts', traceparent='00-e71c784d7151a939ef4e8d886a326456-82ad00a116eaa038-01'*/
初期設定では以下の情報が出力されるようです。
- action
- application
- controller
- db_driver
- framework
- route
- traceparent
設定を追加することで、出力する情報の変更 / 追加が可能です。
mkdir config/initializers
touch config/initializers/marginalia.rb
vim config/initializers/marginalia.rb
# 追加
Marginalia::Comment.components = [ :action, :application, :controller_with_namespace, :hostname, :job, :line]
~
~
~
Rails serverを再起動して再度curlを実行すると先ほど追加した情報が表示されます
/*action='create',application='SqlcommenterRailsDemo',controller_with_namespace='PostsController',
hostname='xxxx',line='/app/controllers/posts_controller.rb:25:in `create\''*/
GET /postsを実行
次にpostの一覧を取得してみます。
curl localhost:3000/posts
SELECT "posts".* FROM "posts"
/*action='index',application='SqlcommenterRailsDemo',controller_with_namespace='PostsController',
hostname='xxxx',line='/app/controllers/posts_controller.rb:19:in `index\''*/
先程のPOSTと同じくactionや実際にSQL文が生成されたコードの位置を出力してくれました。
posts_controller.rbは以下のようになっています。
#...
17 class PostsController < ApplicationController
18 def index
19 render json: Post.all
20 end
21
22 def create
23 title = params[:title].to_s.strip
24 head :bad_request if title.empty?
25 render json: Post.create!(title: title)
26 end
27 end