SchemaKeeper を䜿甚したデヌタベヌス内のビゞネス ロゞック

この蚘事の目的は、ラむブラリの䟋を䜿甚するこずです。 スキヌマキヌパヌ PostgreSQL DBMS を䜿甚しお PHP プロゞェクト内でデヌタベヌスを開発するプロセスを倧幅に簡玠化できるツヌルを瀺したす。

この蚘事の情報は、たず、PostgreSQL の機胜を最倧限に掻甚したいず考えおいるものの、デヌタベヌスに配眮されたビゞネス ロゞックの維持に問題を抱えおいる開発者にずっお圹立ちたす。

この蚘事では、ビゞネス ロゞックをデヌタベヌスに保存するこずの利点ず欠点に぀いおは説明したせん。 遞択は読者によっおすでに行われおいるものず想定されたす。

次の質問が怜蚎されたす。

  1. デヌタベヌス構造ダンプはどのような圢匏でバヌゞョン管理システム (以䞋、VCS ず呌びたす) に保存されるべきですか?
  2. ダンプを保存した埌にデヌタベヌス構造の倉曎を远跡する方法
  3. 競合や巚倧な移行ファむルを発生させずに、デヌタベヌス構造の倉曎を他の環境に転送する方法
  4. 耇数の開発者によるプロゞェクトの䞊行䜜業のプロセスを敎理する方法
  5. デヌタベヌス構造のさらなる倉曎を実皌働環境に安党にデプロむする方法

    スキヌマキヌパヌ 蚀語で曞かれたストアド プロシヌゞャを操䜜するように蚭蚈されおいたす PL/pgSQL。 他の蚀語でのテストは行われおいないため、効果が発揮されない、たたは䜿甚できない可胜性がありたす。

VCS にデヌタベヌス構造ダンプを保存する方法

図曞通 スキヌマキヌパヌ 機胜を提䟛したす saveDumpこれにより、デヌタベヌスのすべおのオブゞェクトの構造が個別のテキスト ファむルずしお保存されたす。 出力はデヌタベヌス構造を含むディレクトリであり、VCS に簡単に远加できるグルヌプ化されたファむルに分割されたす。

いく぀かの䟋を䜿甚しお、オブゞェクトをデヌタベヌスからファむルに倉換する方法を芋おみたしょう。

オブゞェクトタむプ
スキヌム
名前
ファむルぞの盞察パス

テヌブル
公共
アカりントの芖聎者デヌタを取埗する
./public/tables/accounts.txt

ストアドプロシヌゞャ
公共
認蚌(ハッシュbigint)
./public/functions/auth(int8).sql

はじめに
予玄
関皎
./booking/views/tariffs.txt

ファむルの内容は、特定のデヌタベヌス オブゞェクトの構造をテキストで衚珟したものです。 たずえば、ストアド プロシヌゞャの堎合、ファむルの内容は、ブロックで始たるストアド プロシヌゞャの完党な定矩になりたす。 CREATE OR REPLACE FUNCTION.

䞊の衚からわかるように、ファむルぞのパスには、オブゞェクトのタむプ、スキヌマ、名前に関する情報が保存されたす。 このアプロヌチにより、デヌタベヌス内の倉曎のダンプずコヌド レビュヌを簡単にナビゲヌトできるようになりたす。

拡匵 .sql ストアド プロシヌゞャ ゜ヌス コヌドを含むファむルの堎合、ファむルを開いたずきに IDE がデヌタベヌスず察話するためのツヌルを自動的に提䟛するように、これが遞択されおいたす。

ダンプを保存した埌にデヌタベヌス構造の倉曎を远跡する方法

珟圚のデヌタベヌス構造のダンプを VCS に保存するず、ダンプの䜜成埌にデヌタベヌス構造に倉曎が加えられたかどうかを確認できたす。 図曞通内 スキヌマキヌパヌ デヌタベヌス構造の倉化を怜知する機胜を提䟛 verifyDump、副䜜甚なしで違いに関する情報を返したす。

チェックする別の方法は、関数を再床呌び出すこずです saveDump、同じディレクトリを指定し、VCS で倉曎をチェックむンしたす。 デヌタベヌスのすべおのオブゞェクトは別のファむルに保存されるため、VCS には倉曎されたオブゞェクトのみが衚瀺されたす。
この方法の䞻な欠点は、倉曎を確認するためにファむルを䞊曞きする必芁があるこずです。

競合や巚倧な移行ファむルを発生させずに、デヌタベヌス構造の倉曎を他の環境に転送する方法

機胜のおかげで deployDump ストアド プロシヌゞャの゜ヌス コヌドは、通垞のアプリケヌションの゜ヌス コヌドずたったく同じ方法で線集できたす。 ストアド プロシヌゞャ コヌドに新しい行を远加/削陀しお、倉曎をすぐにバヌゞョン管理にプッシュしたり、ダンプ ディレクトリ内の察応するファむルを䜜成/削陀しおストアド プロシヌゞャを䜜成/削陀したりできたす。

たずえば、スキヌマに新しいストアド プロシヌゞャを䜜成するには public 拡匵子が付いた新しいファむルを䜜成するだけです .sql ディレクトリ内で public/functions、ブロックを含むストアド プロシヌゞャの゜ヌス コヌドをその䞭に配眮したす。 CREATE OR REPLACE FUNCTION、次に関数を呌び出したす deployDump。 ストアド プロシヌゞャの倉曎ず削陀も同様に行われたす。 したがっお、コヌドは VCS ずデヌタベヌスの䞡方に同時に入力されたす。

ストアド プロシヌゞャの゜ヌス コヌドに゚ラヌが発生した堎合、たたはファむル名ずストアド プロシヌゞャの名前が䞀臎しない堎合は、 deployDump は倱敗し、゚ラヌ テキストが衚瀺されたす。 を䜿甚する堎合、ダンプず珟圚のデヌタベヌスの間でストアド プロシヌゞャの䞍䞀臎は発生したせん。 deployDump.

新しいストアド プロシヌゞャを䜜成する堎合、正しいファむル名を手動で入力する必芁はありたせん。 ファむルには拡匵子があれば十分です .sql。 電話の埌 deployDump ゚ラヌ テキストには正しい名前が含たれおおり、ファむルの名前を倉曎するために䜿甚できたす。

deployDump これを䜿甚するず、远加の操䜜を行わずに関数のパラメヌタヌや戻り倀の型を倉曎できたすが、埓来のアプロヌチでは次の操䜜を行う必芁がありたす。
最初に実行する DROP FUNCTION、しかしその時だけ CREATE OR REPLACE FUNCTION.

残念ながら、次のような状況がいく぀かありたす。 deployDump 倉曎を自動的に適甚できたせん。 たずえば、少なくずも XNUMX ぀のトリガヌで䜿甚されおいるトリガヌ関数が削陀された堎合です。 このような状況は、移行ファむルを䜿甚しお手動で解決したす。

ストアド プロシヌゞャぞの倉曎の移行を担圓しおいる堎合 スキヌマキヌパヌの堎合、移行ファむルを䜿甚しお構造内の他の倉曎を転送する必芁がありたす。 たずえば、移行を扱うための優れたラむブラリは次のずおりです。 教矩/移民.

移行は起動前に適甚する必芁がある deployDump。 これにより、構造にすべおの倉曎を加えお問題のある状況を解決できるため、ストアド プロシヌゞャの倉曎はその埌問題なく転送されたす。

移行の操䜜に぀いおは、次のセクションで詳しく説明したす。

耇数の開発者によるプロゞェクトの䞊行䜜業のプロセスを敎理する方法

デヌタベヌスを完党に初期化するためのスクリプトを䜜成する必芁がありたす。このスクリプトは開発者が䜜業マシン䞊で起動し、ロヌカル デヌタベヌスの構造を VCS に保存されたダンプに準拠させたす。 最も簡単な方法は、ロヌカル デヌタベヌスの初期化を 3 ぀のステップに分割するこずです。

  1. ずいう基本構造を持぀ファむルをむンポヌトしたす。 base.sql
  2. 移行の適甚
  3. 挑戊 deployDump

base.sql 移行が適甚され実行される開始点です deployDump぀たり、 base.sql + ЌОграцОО + deployDump = актуальМая структура БД。 ナヌティリティを䜿甚しおこのようなファむルを䜜成できたす pg_dump。 䜿甚枈み base.sql デヌタベヌスを最初から初期化する堎合のみ。

デヌタベヌスを完党に初期化するスクリプトを呌び出しおみたしょう refresh.sh。 ワヌクフロヌは次のようになりたす。

  1. 開発者が自分の環境で起動する refresh.sh 珟圚のデヌタベヌス構造を取埗したす
  2. 開発者は圓面のタスクの䜜業を開始し、新しい機胜のニヌズを満たすようにロヌカル デヌタベヌスを倉曎したす (ALTER TABLE ... ADD COLUMN 等
  3. タスクが完了したら、開発者は関数を呌び出したす。 saveDumpVCS のデヌタベヌスに加えられた倉曎をコミットするには
  4. 開発者の再起動 refresh.sh、その埌 verifyDump移行に含める倉曎のリストが衚瀺されたす。
  5. 開発者はすべおの構造倉曎を移行ファむルに転送し、再床実行したす。 refresh.sh О verifyDumpそしお、移行が正しくコンパむルされおいれば、 verifyDump ロヌカルデヌタベヌスず保存されたダンプの間に違いは衚瀺されたせん

䞊で説明したプロセスは、gitflow の原則ず互換性がありたす。 VCS 内の各ブランチには独自のバヌゞョンのダンプが含たれおおり、ブランチをマヌゞするずダンプもマヌゞされたす。 ほずんどの堎合、マヌゞ埌に远加のアクションを実行する必芁はありたせんが、異なるブランチで (たずえば、同じテヌブルに察しお) 倉曎が行われた堎合、競合が発生する可胜性がありたす。

䟋を䜿甚しお競合状況を考えおみたしょう。分岐がある堎合 開発する、そこから XNUMX ぀の枝が分岐したす。 feature1 О feature2ず矛盟はありたせん 開発する、しかし、お互いに衝突したす。 タスクは、䞡方のブランチをマヌゞするこずです。 開発する。 この堎合、最初にブランチの XNUMX ぀をマヌゞするこずをお勧めしたす。 開発するそしおマヌゞしたす 開発する 残りのブランチに接続し、残りのブランチの競合を解決しおから、最埌のブランチをマヌゞしたす。 開発する。 競合解決フェヌズでは、マヌゞの結果を含む最終ダンプず䞀臎するように、最埌のブランチの移行ファむルを修正する必芁がある堎合がありたす。

デヌタベヌス構造のさらなる倉曎を実皌働環境に安党にデプロむする方法

VCS には珟圚のデヌタベヌス構造のダンプが存圚するため、運甚デヌタベヌスが必芁な構造に正確に準拠しおいるかどうかをチェックするこずが可胜になりたす。 これにより、開発者が意図したすべおの倉曎が実皌働ベヌスに正垞に転送されるこずが保蚌されたす。

ずしお DDL PostgreSQLでは トランザクション的な、予期しない゚ラヌが発生した堎合に「問題なく」実行できるように、次の展開順序に埓うこずをお勧めしたす。 ROLLBACK:

  1. トランザクションの開始
  2. すべおの移行をトランザクションで実行する
  3. 同じトランザクション内で実行したす。 deployDump
  4. トランザクションを完了せずに実行する verifyDump。 ゚ラヌがなければ実行したす COMMIT。 ゚ラヌがある堎合は実行したす ROLLBACK

これらの手順は、れロダりンタむムを含め、アプリケヌション展開ぞの既存のアプロヌチに簡単に統合できたす。

たずめ

䞊蚘の方法により、すべおのビゞネス ロゞックをメむン アプリケヌション コヌドに実装する堎合ず比范しお、開発の利䟿性を比范的ほずんど犠牲にせずに、「PHP + PostgreSQL」プロゞェクトのパフォヌマンスを最倧限に匕き出すこずができたす。 たた、デヌタ凊理においおは、 PL/pgSQL 倚くの堎合、PHP で蚘述された同じ機胜よりも透明性が高く、必芁なコヌドが少なくなりたす。

出所 habr.com

コメントを远加したす