複数行の文字列の表現

symfonyを使っているせいか、最近良く、設定ファイルとしてYAMLを利用するんですが、SQLを設定ファイルの中に書いておいて、それを実行するなんていったときに、SQLが長くなった時、非常に見づらいなんて思ってました。

こんな感じ。。。。うむ見づらい。

setteing:
 sql:"select a.name , a.email, b.zip_code, b.prefecture, b.address from user_master a left join address b on a.user_id = b.user_id order by a.user_id"

とくにSQLなんか複雑になればなるほど、複数行にまたがって記述できた方が当然いいなーと思ってたんですが、実はできるんですよ!この馬鹿!って話です。

参考の記事にはこんな風に書いてありましたw

## 各行の改行を保存する
text1: |
aaa
bbb
ccc


## 各行の改行と、最終行に続く改行を保存する
text2: |+
aaa
bbb
ccc


## 各行の改行は保存するが、最終行の改行は取り除く
text3: |-
aaa
bbb
ccc


## 改行を半角スペースに置き換える、ただし最終行の改行は保存される
text4: >
aaa
bbb
ccc


## 改行を半角スペースに置き換え、最終行に続く改行を保存する
text5: >+
aaa
bbb
ccc


## 改行を半角スペースに置き換え、最終行の改行を取り除く
text6: >-
aaa
bbb
ccc

るびま

てかこの記事、前に見たような気がするんですが、さっぱり記憶から抜け落ちてました...orz この記事は、主にRubyのSyckについて書かれたものですが、はてsymfonyYAMLパーサは上の奴をどこまでカバーしてるんでしょう。調べてみました。

symfony(1.0系)のYAMLパーサ(sfYaml)はどうやら、PHP拡張モジュールの「syck」が使えればそちらを優先して、使えなければ、「Spyc」というライブラリを利用するようになってました。手元の環境では「syck」が入っていないので、Spyc(0.2.3)で上記の表現を試してみると。。。。

  • 「|」「>」はパース可能
  • 「|+」「|-」「>+」「>-」はパース不可

Spycでも何か設定すると、パース不可のものが対応できるのかも知れないけど(そこまで真面目に見てない)、とりあえずデフォでは非常にシンプルな対応状況でした。

さて話が横にそれましたが、最初の問題では、対象がSQLで特に改行を保持する必要はないので、「>」記号があれば事足りる気がします。こんな感じ。

setteing:
 sql: > 
    select 
     a.name , 
     a.email, 
     b.zip_code, 
     b.prefecture, 
     b.address 
    from 
     user_master a left join user_address b on a.user_id = b.user_id
    order by a.user_id asc

若干行数が多くなりましたが、一行で書くよりは可読性も、更新性もあるかと思います。
一点注意点を書くとすると、YAMLはインデントでブロックを判断しているので、SQLの左側は同じ列になるようにそろえないとエラーになる。 別に「>」の後の部分であれば、インデントを右にずらしても空白が多くなるだけなので、特に問題なかったお。ただブロックの一番上のselectより左に、文字列が始まるとその前までしか認識しないので注意が必要だよ。

setteing:
 sql: > 
    select 
     a.name , 
     a.email, 
     b.zip_code, 
     b.prefecture, 
     b.address 
   from # ←「select」より左にインデントがあると× 
        #「b.address」までしかパースされない。
     user_master a left join user_address b on a.user_id = b.user_id
    order by a.user_id asc

まぁせっかく纏まった記事があるんだから、ちゃんと呼んでからYAMLが使えますとか言おうや坊主!的な感じですね。すいませんでしたm(_ _)m

さてkozawa先生が、よいエントリを書いていたので、僕も自らの欲望にしたがって、やりたいことをやろうと思います。。。。。。。。。寝る!!!!!w

■ 追記

symfonyの1.0系では、エクステンションの「syck」か「Spyc」を使うと書きましたが、どうやら、1.1系では、オリジナルのYAMLパーサーを使ってるっぽい。。。orz