decochのブログ

フリーランスのiOSエンジニア decoch のブログです

Railsのスキーマ情報をDBFlute-Introで管理しよう

前回 DBFlute-Intro を使ってデータベースのドキュメントを管理する方法をまとめました。

decoch.hatenablog.com

私は普段、Ruby on RailsWebサービスの開発をしているのですが、その際にいくつかエラーが出てしまったのでその回避方法をまとめます。

DBFlute-IntroをRailsを使う時の問題

Ruby on Rails で開発するときは、ライブラリが自動生成するテーブルがあったり、カラム名に規約があり意図せずにMySQL予約語を使ってしまうケースが多々あります。 一方でDBFlute-Intro では、依存しているDBFluteが基本的に予約語は使わない想定で作られているため、ドキュメント生成時に以下のようなエラーが起きてしまいました。

[df-jdbc] /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
[df-jdbc] Failed to execute the SQL for getting auto-increment
[df-jdbc] 
[df-jdbc] [Advice]
[df-jdbc] DBFlute executes the SQL to get auto-increment meta data.
[df-jdbc] The table might not exist on your schema. Or the schema
[df-jdbc] to be set at 'dfprop' might be mistake in the first place.
[df-jdbc] 
[df-jdbc] And other points can be causes
[df-jdbc]  e.g. reservation word, authentication, ...
[df-jdbc] If your primary key of the table is reservation word in the DBMS,
[df-jdbc] set quatation settings 'quoteColumnNameList' of littleAdjustmentMap.dfprop.
[df-jdbc] 
[df-jdbc] So check your settings and environments.
[df-jdbc] 
[df-jdbc] [Table]
[df-jdbc] maihamadb.ar_internal_metadata
[df-jdbc] 
[df-jdbc] [PrimaryKey]
[df-jdbc] key
[df-jdbc] 
[df-jdbc] [SQL for getting]
[df-jdbc] select key from ar_internal_metadata where 0 = 1
[df-jdbc] * * * * * * * * * */

key という名前が予約語になっているようです...

解決策

DBFlute予約語を使いたい場合は、 自動で生成された dbflute_xxx のディレクトリに存在する、littleAdjustmentMap.dfprop を以下のように変更します。

ディレクト

dbflute_xxx
└ dfprop
    └ littleAdjustmentMap.dfprop
-#; quoteTableNameList = list:{}
+; quoteTableNameList = list:{$$ALL$$}

... 省略

-#; quoteColumnNameList = list:{}
+; quoteColumnNameList = list:{$$ALL$$}

この変更をすることで、テーブル名とカラム名をバッククオートで囲った状態で扱う事ができます。

まとめ