Railsのスキーマ情報をDBFlute-Introで管理しよう
前回 DBFlute-Intro を使ってデータベースのドキュメントを管理する方法をまとめました。
私は普段、Ruby on Rails でWebサービスの開発をしているのですが、その際にいくつかエラーが出てしまったのでその回避方法をまとめます。
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$$}
この変更をすることで、テーブル名とカラム名をバッククオートで囲った状態で扱う事ができます。
まとめ
- Ruby on Rails の スキーマも DBFlute-Introで管理することができる
- 予約語を使うOR Mapper を使う場合は、DBFlute-Intro側の設定変更が必要