質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

5回答

3557閲覧

SQL文を外だしするには?

palm-t

総合スコア37

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2018/03/24 06:45

編集2018/03/24 16:48

###前提・実現したいこと
お世話になります。

SQL文をプログラム外部に配置することで、可読性・メンテナンス性を
向上させることができるようです。

参考にしたページ

SQL文をプログラム内のあちらこちらに書くのもどうしたものか
と考えていたので、
確かに参考ページのように外だしできれば、
どこに必要なSQL文があるか把握しやすいと思いました。

そこで今回の質問内容は、
「SQL文を外だしするのに利用できるフォーマットはどのようなものがあるか」
ということです。

以下ようなことができるフォーマットであれば、
SQL文を外だしして便利に扱えるのではないかと思っています。


1.コメントを書ける
// 商品一覧を取得する
sql001 = "select * from goods"

2.長いSQL文を改行しても一つの文として認識する

3.PHPの専用フォーマットでなく、別言語からも利用できる

4.SQL文に名前を付け識別・特定ができる
sql002 = "select * from users"

select_all_categories = "select * from categories"

5.言語機能やライブラリなどが存在していて簡単にフォーマットを利用できる


※私が「SQL文をプログラム内のあちらこちらに書くのをどうにかしたい」と
上で書いたので、回答者の皆様に「SQL文の共通化」のために外部化したいと
伝わってしまったようです。
むしろ逆で「複雑・使い回しできない特化したSQL文」を
どう管理するかがこの質問の理由・目的です。

誤解を招く質問内容で申し訳ありませんでした。

以下補足になります。

  • クエリビルダのような機能を利用して書くには少し大変な・書きにくい

問い合わせ処理を生のSQL文で書いてしまいたいという状況を想定しています。

  • 簡単なSQL文というより、JOINやサブクエリなどが必要な「複雑・使い回しできない特化したSQL文」

を上手く管理したいというのが質問した理由です。

  • フォーマットの条件の

1(コメントを書ける)
2(join・サブクエリなどを利用すると長くなるので改行したい)
4(コメントと合わせて理解しやすいように重複しないユニークなエイリアスを付けたい。
および、iniファイルのようなname=value型の構造をイメージしていた)
は上記のような利用を想定していたからです。

XMLやJSONを見ましたが、SQL文を外だしするという用途には、少し使いにくいような気がします。
よろしくお願いいたします。

###補足情報(言語/FW/ツール等のバージョンなど)
PHP 5.5以降
SQL

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

プログラミングは通常、適切な抽象化を行うことが品質の維持に直結していてそれを行うことが推奨されるんですが、
こと、SQLにおいては、それはアンチパターンになると考えています。

SQLをソースコードから切り離して1箇所に纏めようという試みは昔から行われていて、その代表的な物がJavaのDAO(Data Acess Object)パターンだったりするわけですが、そうしたアプローチを採用した場合に何が起こるのかを想定したシナリオを時系列順に記します。

###第1段階:実装開始

とても気持ちよく実装できます。きれいなコードを心掛けている人ほど楽しく、良いシステムを作っている実感がみなぎっています。

###第2段階:2カ月後

実装の過程で行われた仕様変更への対応や初期段階での実装の改善などの対応が出始めます。
この段階では実装者の記憶がまだ生きているため、とくに問題を感じずに修正が行われ、品質は維持されます。

###第3段階:3カ月後

開発も終盤に差し掛かりテストが行われる段階です。既に書き溜めたソースコードも膨大になってきて記憶だけでは賄いきれなくなっています。SQLストアの項目量も相当な数になっています。

運用テストの結果でNGとなった項目についての修正等が行われますが、少しずつメンテナンス性の低さが浮き彫りになり始めます。
まず、修正を行うためにソースコードの問題個所を特定するのですが、修正しようと思ったその場所に問題のSQLは存在しません。SQLは外だしで1箇所に纏められてしまっているからです。

この段階では納期のお尻も見え始め、時間に追われる事が多くなってきますが、SQLを外出しにした事による改修の難しさに気付きはじめます。

例えばDAOの様に単純なメソッド呼び出しになっているのであれば、IDEのコードジャンプ機能を利用して比較的楽に該当SQLの場所までは辿りつけるのですが、今回の命題のように汎用フォーマットを利用しているとそれも出来ません。
結果、都度“シンボルについてSQLのストアを検索して対象のSQLを探す作業”が必要になってきます。この不便さが改修を遅らせます。時間に追われている段階でのこの作業はストレスを増大させ、関係のないミスも増えるようになります。

また、この頃から既に、後述の問題も少しずつ露呈し始めます。

###第4段階:リリース(4ヶ月後)

お疲れ様です。後のメンテナンスのために、最終的なコードの整理とメンテナンス用のドキュメントを作成しましょう。
SQLストアについての仕様書も併せて作成します。

###第5段階:運用後の仕様変更、逐次バグ対応(6カ月後)

運用を行っていると「ここはこうした方が便利だ」「ここの動作はおかしい」といった改善要望が必ず出てきます。システムは作ることに意味があるのではなく、使うことに意味があるので当然なのですが、この時点で本当の問題が発覚してきます。

例えば、ある検索結果の表示項目を変更しなければならなくなったとします。この“処理A”のために、まず、ソースコード上でその表示項目を取得している場所を特定しますが、前述したとおり、その場所にSQLクエリは存在しません。例によって、シンボルでクエリを検索により特定します。

クエリが特定できたのでその修正を行いたいところですが、ちょっと待ってください。本当にこれを修正しても良いのでしょうか?

コードの抽象化の目的の一つは“再利用”です。抽象化されているこのクエリは、実は、別の場所でも使われいる可能性があります。“処理A”のためにDBからデータを取得しているクエリは同様に“処理B”や“処理C”のデータも取得しているかもしれません。

実際、安易にSQLをいじったために、後日、全く別の場所でのデグレードが発覚してその対応に追われたりします。

ですから、このクエリを変更するためには、今回の改修とは関係のない処理Bや処理Cについても動作テストの必要性が出てきます。

動作テスト以前に、その箇所の特定方法も問題になってきます。

開発から半年も経過しているので、既に記憶は頼りになりません。リリース時に作成したドキュメントがあるので“まだ”ある程度は頼りになるでしょう。

適切な改修を行ってテストを行い、本番環境にリリースします。ドキュメントも更新しておきましょう。

###第6段階:更なる継時的な改修(10ヶ月以降)

既に運用段階にあることから、当該システムのソースコードに携わる事は日常的では無くなっています。主に運用を行っていたり、あるいは別のシステムを作っていたりします。もはや、開発当時の記憶は残っていないに等しい状態です。

ですが、機能追加や改善要望はある日突然やってきます。

その度に当該システムのソースコードと再会することになりますが、今となってはほぼ、初見と変わりません。

例によって問題のソースコード箇所を特定しますが、そこにSQLはありません。シンボルを足掛かりにSQLストアを検索し、該当SQLを探り当てます。しかし、安易に改修をしてはいけません。他で使われているかもしれないからです。このため、影響範囲を調べます。

必ずしも影響範囲を調べる時間が与えられるとは限りません。外部的に見て些細な改修であれば、「ここ、ちょちょっと直してよ」という程度の改修と捉えられることもよくあることです。

こうなると、だんだん品質はなし崩しになっていきます。

一番簡単なのは、新規シンボルを起こして新たなSQLをストアする事です。これであれば絶対に他に影響が広がる事はありません。ドキュメントに新規SQLについての情報を追加しておけば問題ないでしょう。

こうして少しずつ、SQLストア内に不協和音が漂いはじめます。

###第7段階:崩壊期(1年~2年以降)

SQLストアを見てみましょう。新たな改修の度につぎ足されたSQLがあちこちに見受けられるようになっています。どこで使っているのかよくわからないSQL、それはおろか、使っているのかいないのかすらわからないSQLがあちこちに存在するようになります。この頃には、ドキュメントとの乖離も頻繁に見られるようになっています。

本来なら品質を維持するためにコードとドキュメントの整頓を行いたいところですが、そんな時間は与えられません。

忙しい時間の中で改修依頼が断続的にやってきて、結果、つぎはぎのSQLが追加されて行きます。ドキュメントはメンテナンスされなくなって、ほぼ、意味のない紙屑となります。

###第8段階:末期(3年)

当初綺麗だったコードは、今となっては見る影もありません。場当たり的に追加されたコード、メンテナンスされていないドキュメントが、システム担当者を苦しめます。

場合によっては、開発当初のシステム担当者は既に存在しません。嫌気がさして辞めてしまいました。

あらたな担当者のあなたは、この燦燦たる荒野を、空の星だけを頼りに毎日さまよいます。

今日も追加改修依頼が来ました。

まったくあてにならないドキュメントからなんとか該当ソースコードを探り当て、そこで見つけたシンボルからSQLストアを検索して対象SQLクエリにたどり着いて、やっと改修の目途を立てます。

しかし、安易に改修してはいけません。他の処理でも共通のクエリが利用されているかもしれないからです。

どうしましょう? あなたに与えられた時間はそれほど多くはありません。ゆっくり影響範囲を調べている時間もありません。

あなたはおもむろに、新たなシンボルを追加し、元のSQLクエリをコピーペーストしてから今回の修正対応を行うことにしました。これなら他に影響が出ることは絶対にありません。ドキュメントの更改も行う必要はありません。だって、あなたがこの職に就いた時点でもうとっくに現状と乖離していたんですから。

手早く改修を終えたあなたは、壮大なごみクズの山となったSQLストアファイルを閉じてコーヒーを飲んでからため息をつきます。

『この仕様考えた奴、死ねばいいのに…』

投稿2018/03/24 12:51

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/03/24 13:26 編集

そんなこと言ったら、共通化するなって話になりませんか? ストアドにするのも分離するから駄目って話になるし。 何れにしてもリソースの管理が行われていなければ結果は同じだと思いますけど。
退会済みユーザー

退会済みユーザー

2018/03/24 13:27

そうですよ。SQLに限っては、共通化するなって話です。まだ気づきませんか?
退会済みユーザー

退会済みユーザー

2018/03/24 13:28

なんか勘違いしている人が多いんですが、SQLはモデルの本質ではないんです。
退会済みユーザー

退会済みユーザー

2018/03/24 13:29

モデルっていうのはビジネスロジックそのものなんですが、SQLはモデルそれぞれに属するもので、共通化すべきものではありません。たとえ同じSQLを発行するとしても、それは全く別のロジックの一部でしかないんです。
sazi

2018/03/24 13:37

フロントの技術者とDB回りの技術者に分けて、インターフェースをきっちり決めてそれぞれの専門分野で、作業することによって効率が上がってるプロジェクトもありますけどね。 状況に応じてってことで良いんじゃないでしょうか。
退会済みユーザー

退会済みユーザー

2018/03/24 13:42

良くないですね。共通化しようがしまいがフロント技術者が触る層の話ではないので、あなたの言っていることは的外れです。
退会済みユーザー

退会済みユーザー

2018/03/24 13:42

ORDBMS からはじまったやつだしな・・・
退会済みユーザー

退会済みユーザー

2018/03/24 13:43 編集

DB周りの技術者って、SQLだけメンテしてる技術者ですか? そんなの現状、存在するんですか?
退会済みユーザー

退会済みユーザー

2018/03/24 13:44

Javaカーが良い例ですが、お役所仕事的に“アレ”は“アノ”部署の管轄、みたいなことやると、時間も手間も金も莫大にかかるんですよ。
sazi

2018/03/25 11:58 編集

存在はしてますよ。仮に存在していなかったとしても、保守の話をされているところで、専門分野に分かれて効率が良くなる場面を想像できないっていうのも一方的です。 なんでモデルの話を引き合いに出されるのか分かりません。 モデルとプログラムは1:1にすべきって事を言われてます?
退会済みユーザー

退会済みユーザー

2018/03/24 13:54

>モデルとプログラムは1:1にすべきって事を言われてます? 言ってないですねー。モデルの部品であるSQLを共通化すべき理由がないって話ですね。 というか、あなた、“~も存在します”って論調でずっと話してますけど、存在したらなんなんです? それが便利だという事の何の証明になるんですか? 僕が例示したシナリオの“ここが破綻している”というなら分かるんですけど、それが全くない。 あなたの書いてることはどこかの島の夢物語です。
sazi

2018/03/24 14:00

破綻しているとはいってませんよ。 あなたの言うようにやったとして、要件によって同じような処理を行っているのが複数のモデルで該当している場合、結局検索しないと分からないってことになりませんか?
退会済みユーザー

退会済みユーザー

2018/03/24 14:02

ならないです。何言ってるのか、自分で分かっていますか?
退会済みユーザー

退会済みユーザー

2018/03/24 14:03

saziさんは、モデルって何なのか分かってないんじゃないかなぁ。
sazi

2018/03/24 14:03

SQLは共通化すべきじゃないっていうのはどういうことでしょうか? 共通化の部品があったとして、それがどのような言語で書かれているかが関係しているのですか?
退会済みユーザー

退会済みユーザー

2018/03/24 14:04

>SQLは共通化すべきじゃないっていうのはどういうことでしょうか? それは、日本語の意味が分からないという話ですか? それとも、「SQLは共通化すべきじゃないのは何故ですか?」という、これまでの説明を全く無視した質問ですか?
退会済みユーザー

退会済みユーザー

2018/03/24 14:05

>共通化の部品があったとして 共通化すべきでないという話をしているのに、「あったとして」って何ですか?
退会済みユーザー

退会済みユーザー

2018/03/24 14:05

>それがどのような言語で書かれているかが関係しているのですか? 言語の話なんか、これまで一度も出ていないです。
退会済みユーザー

退会済みユーザー

2018/03/24 14:06

もう、何言ってるのか全く分からないから、ちゃんと書き込み内容を読んで、話を整理してから質問してください。
sazi

2018/03/24 14:09

共通化について否定はされていないのですよね? では、言い直して、 共通化されている部品がどのような言語で書かれているかが、あなたが言われている、SQLは共通化すべきではないということにどのように関係していますか?
sazi

2018/03/24 14:10

SQLってプログラミング言語じゃないと言われてます?
退会済みユーザー

退会済みユーザー

2018/03/24 14:11

言語の話なんか誰もしていないのに、なんでそれにこだわるのか全く分からないのと、 共通化すべきところはすべきだが、SQLはすべきではないと繰り返し言っているのに何が理解できないのか理解できないのと。 saziさん、酔っぱらってるんですか?
退会済みユーザー

退会済みユーザー

2018/03/24 14:12

>SQLってプログラミング言語じゃないと言われてます? そういうキチガイみたいな話がしたいんですか?
退会済みユーザー

退会済みユーザー

2018/03/24 14:12

こーれは、すごい暇人だった。
sazi

2018/03/24 14:14

いや、飲みたい気分ですが、いたって素面ですw じゃあ、ここらで議論(私はそのつもり)は終わりにしておきます。
退会済みユーザー

退会済みユーザー

2018/03/24 14:14

「言語の話なんかしていない」から、“どの言語だから実装はこう”みたいな話ではないと言っているのに、 >SQLってプログラミング言語じゃないと言われてます? っていう返し、どうなの? これ。 まじ、頭おかしい。
sazi

2018/03/24 14:20

議論したかったのですけど、ちょいちょい議論には不必要なノイズを挟んで正面から向き合ってくれないので、致し方ないです。
退会済みユーザー

退会済みユーザー

2018/03/24 14:22

人の質問で議論を長々とするもんじゃないよ
退会済みユーザー

退会済みユーザー

2018/03/24 14:22

あなたがまともな議題を提起していれば済んだ話ですけどね。 あなた、めちゃくちゃですよ。
sazi

2018/03/24 14:22

誤解なきようにコメントしますが、回答を否定はしていませんので。
退会済みユーザー

退会済みユーザー

2018/03/24 14:23

おまえは毎回毎回、黙っとれ >asahina1979
退会済みユーザー

退会済みユーザー

2018/03/24 14:24

否定するかどうかでなく、広範な現状を鑑みて、現実に即してどうかを語りなさいよ >sazi あなたの夢の島なんか、現実にどのくらいあるんです?
退会済みユーザー

退会済みユーザー

2018/03/24 14:25

つーか、“議論したかった”ってなんだよ… ここ、質問回答のサイトで、議論サイトじゃねーよ…
sazi

2018/03/24 14:29 編集

>teratailは技術に興味のある人達が集まって、質問と回答を通してお互いに知識や情報を交換・共有する場所です。 議論って言葉は不適切でしたかね。 「知識や情報を交換・共有」する為の会話がしたかった、ならいいですかね。
退会済みユーザー

退会済みユーザー

2018/03/24 14:29

teratailは技術に興味のある人達が集まって、“質問者”と“回答者”が、質問と回答を通してお互いに知識や情報を交換・共有する場所です。
退会済みユーザー

退会済みユーザー

2018/03/24 14:30 編集

質問者抜きにやるな、ヴァカ
sazi

2018/03/24 14:30

ああ、そういう風に解釈してるってことですね。
退会済みユーザー

退会済みユーザー

2018/03/24 14:31

酔っぱらってんのかよ、こいつ
buhoho

2021/10/17 12:06

開発時の人に連絡取れ無い状況で、全く同じ目に遭ってるので同意しかない。うっすら感じてたけどやっぱりSQLの共通化は基本的にNGにした方が管理しやすそう。そしてSQLが「共通利用されていないことを保証でき無い」ことにつながるので、外部ファイルに書き出すこと自体も慎重に検討する必要がありそう。PHPの中にSQL直接書くの気持ち悪いけど、これが一番安全なのかな。
guest

0

ベストアンサー

「SQL文を外だしするのに利用できるフォーマットはどのようなものがあるか」

そのファイル自体のメンテナンスとプログラムから読み込むということで、プレーンテキストで良いのじゃないでしょうか。
一般的なテキストエディタならSQLでのキーワードなどの強調文字などに対応していますし、文字コードの変更もしやすいですから。

PHP内からの.sqlファイルの読み込みphp
PHPには詳しくありませんが、プレースホルダを含めた形のSQLでも多分実行できると思います。
※同然プレースフォルダの値設定の処理は必要です。まあ、そこらへんは質問者さんは分かっておられると思いますけど。
但し、他の言語との互換性は低くなるでしょうが。

追記

質問者さんの参考にされたページのリンクに以下があります。
SQLの共通を図ってはならない
この持ち方だと、修正などでの影響範囲を少なくする事ができますね。
類似処理を一つのファイルに纏めるなどの拡張性を考えるとタグで管理できる、
XMLの方が良いかもしれませんね。

私も分離した方が可読性は良くなるなどのメリットはあると思っています。
デメリットの方が大きいとするのは、関係が不明瞭になる、ってことですかね。

モデルが複数のソースファイルで構成されると、ドキュメント無しでは読めなくなってしまうという人が殆どって事なのでしょうから、後の人の事も考えてその構成のルール等はきちんと決めて文書化しておかなければいけませんね。

責められるのは、「なんでこんな構成にした」よりも先に「なんで構成管理ができていないのか」だと思いますので。

追記2

質問の追記を見落としてましたので追記。

1(コメントを書ける)
2(join・サブクエリなどを利用すると長くなるので改行したい)
4(コメントと合わせて理解しやすいように重複しないユニークなエイリアスを付けたい。
および、iniファイルのようなname=value型の構造をイメージしていた)

上記からするとXMLじゃないでしょうか。
1.SQL文中には使用するDBMSのコメントが書けるし、XMLでのコメントも書ける。
2.XMLのタグで囲まれた部分を、一つの文字列として取り出せば良いので改行を使用しても問題ない。
4.読み出すのにどの道必要ですから、タグとして識別子を設定

XMLやJSONを見ましたが、SQL文を外だしするという用途には、少し使いにくいような気がします。

逆にどういった点を使いにくいと思われたのでしょう?


実際XMLでSQLを外出しにするのはかなり前からありますし、その時のことを少し思い出したので追記。
xmlなので不等号(< や >)などのSQL文中にそのまま記述できないエスケープ文字がありましたね、そういえば。
※CDATAについて指摘があったので、追記。何れにせよエスケープ文字はあります。

CDATAセクションは、 <や&をエスケープしなくてよい場所ですが、 ]]>という文字列が含まれる場合には ]]>のようにエスケープする必要があります。

じゃ、iniファイルではどうかというと、
phpだと、parse_ini_file()で取得できるみたいですけど、多次元の配列で返却となってます。
この場合、改行の扱いがどうなるかですけど、ちょっとわかりませんでした。

何れにせよフォーマットがあるなら、エスケープ文字は付きまとうでしょうから、結局のところ、プレーンテキストで、セクションなどの決めを持たせて、読み込み後に、preg_split()で分割して処理するなどとした方が、自由に加工出来て良いのではないでしょうか。
java系だと「2way-SQL方式」などという事で、外出し用のライブラリがあるので、PHPにも同様な物があるのかもしれませんが。
※もう古いですが(S2Dao.PHP5

投稿2018/03/24 14:47

編集2018/03/27 17:26
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/03/26 05:59 編集

マイナス評価された方は理由をコメントして下さると、嬉しいのですが。 「アクションバッジ」の「コメンテーター」というバッジで、「誰かがした回答に誤りがあれば、丁寧に指摘をしてあげてください。みなさんのためになります。」とあります。 私は、回答へのコメントはマナーを守ったものであれば推奨されているものだと解釈しています。 回答へコメントすることは、回答の内容についての質を上げるもので、 またそれは、質問と関係あるものに限らないと思っています。 ※回答自体は質問に関係しているでしょうが、質問とは直接関係の無い回答の局所的な部分に、コメントするなど かといって、話が逸れて延々に続くのは好ましくはありませんので、質問者や後学者が認識できるような問題提起ができたと思ったら、それで終わりにするようにしていますけど。 [追記] 「アクションバッジ」の「コメンテーター」というバッジの説明が「コメントする時は他のユーザーに伝わるように明確にしてください。きっと誰かの役に立ちます。」に変更されていました。 変更の意図としては、「誤った回答への指摘に限定」では無いって事ですね。 #色々とチェックされているんですね。中の人お疲れ様です。
退会済みユーザー

退会済みユーザー

2018/03/25 06:23

マイナスしたの、まさか俺だと思ってる訳じゃ無いよね? 違うから。
palm-t

2018/03/25 06:32

回答ありがとうございます。 SQLの外だしの用途でXML・JSONで使いにくいと思った点に関して ・XMLは、<sql>作ったSQL文</sql>のようにタグを用いて定義するところ (SQL文の外だしというシンプルな用途には少し大げさ・オーバースペックな感じがします) ・JSONは、コメントを書けないところ saziさんの「XMLでSQLを外出しにするのはかなり前からある」との回答から XMLやJSONとは別のデータ定義フォーマットを探したところ YAMLというものがヒットしたのでこれを使おうかと考えています。 読み込み処理の参考ページ https://akamist.com/blog/archives/429 symfony/yamlパッケージを使うだけで便利に利用できるようです。 xamppで試してみましたが、きちんとSQL文を取得することができました。 1-5の条件に関してもほぼ満たしていると思います。 また、不等号を利用しているSQL文もそのまま記述できています。 saziさんの回答がYAMLの調査・発見につながったこと、 質問自体が外だしのためのフォーマットに関してだったので saziさんの回答をベストアンサーにさせてください。
退会済みユーザー

退会済みユーザー

2018/03/25 06:38

手段が目的化してんなぁ…
sazi

2018/03/25 06:45

yamlも見てたんですが、結局エスケープ文字があるので敢えて挙げていませんでした。 クォート `'`はエスケープしないと駄目なので、素のSQLでは書けない場面もあるかと思うので注意して下さい。
退会済みユーザー

退会済みユーザー

2018/03/27 15:21

> xmlなので不等号(< や >)などのSQL文中にそのまま記述できないエスケープ文字がありましたね、そういえば。 つ CDATA セクション
sazi

2018/03/27 17:13 編集

>CDATA セクション それも、終わった後に気付いたのを思い出したw それがマイナスの理由かな。
退会済みユーザー

退会済みユーザー

2018/03/27 23:38

多分違うんじゃない?
guest

0

できたら、ORマッピングしてコード上でJoin相当の作業した方が後で苦労がなくていいです。
変更も管理も楽です。(saziさんが挙げている”SQLの共通を図ってはならない”に書いてあるようなやり方です。)

レスポンスに問題が出た場合は、その限りではありませんが、その時はDBの設計やインデックスと貼り方が不味いことが多いのでその方向での調査もした方がよいと思われます。

とにかく生のSQLをどれだけ減らせるか頑張ってください。

その上で、大き目のSQLがどうしても必要な場合、(まあ、そうなのでしょうね。)SQLと呼び出しコードは絶対に1対1になるようにしておいてください。破られるとluckerさんが書いたようなことになります。そういう意味でリンクにあったSQLをIDで管理するという方法は非常にまずい方法です。

ただ、PHPもヒアドキュメントで書けるようなので、外だししなくても問題なさそうな気もします。(http://www.iqueve.co.jp/staff_blog/archives/477.html)

SQLを発行しているコードについては、ファイル名なりフォルダなりを工夫すればどこを調べるかは一目瞭然だと思います。

投稿2018/03/26 14:35

iwamoto_takaaki

総合スコア2883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

palm-t

2018/03/27 15:16

ヒアドキュメントの情報ありがとうございます。 どうしても生のSQL文が必要な場合は、 このヒアドキュメントの方法で記述して、 フォルダとファイルを組み合わせて整理していくようします。
guest

0

あんまり分かっていない人が、現役世代にも多いんですが、
それやると、1年後とかに確実に死にますよ。

投稿2018/03/24 07:20

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

palm-t

2018/03/24 08:52

回答ありがとうございます。 追加で質問させてください。 1.「1年後とかに確実に死にますよ」とは プログラムの修正・追加などを後でしようとすると「SQL文の外だし」したのが原因で、 バグが多発して炎上する、プログラムの修正が困難になるとの意味でしょうか? 2.「SQL文の外だし」が「死(≒メンテナンス性の低下・プログラムの修正が困難)」を招くとのことですが、 特定のDBMSようのSQL文を書くのは、あとでDBMSを変更にするときに困難になるとの理解であってますでしょうか? それとも別の理由でしょうか? 3.luckerさんの経験上で結構ですので、「SQL文の外だし」のデメリットはどのようなことだと思いますでしょうか?
退会済みユーザー

退会済みユーザー

2018/03/24 12:52

長いので、新たに回答起こしました。日本中の現場で、こんな事が毎日のように行われている事実です。
guest

0

面接に行っただけで仕事は断ったけど、OracleでSTORED PROGRAMを使わないで西暦→和暦変換さえ必要なSQL毎にやっているってお客様を思い出す。

投稿2018/03/25 01:59

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/25 06:21

なぜ思い出したのか意味不明なんですが、頭おかしいんですか?
Orlofsky

2018/03/26 22:01

元号が変わったら修正がいっぱい必要で儲かる。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問