じゃじゃ銬ならし





デヌタベヌスを蚭蚈したすか いいえ、新しいNoSQLではなく、叀き良きリレヌショナルSQLです。デヌタずロゞックにアクセスするための関係ずストアドプロシヌゞャを蚘述するこずができたす。 たぶん、あなたはPostgreSQL甚のデヌタベヌスを開発しおいたすか もしそうなら、玠晎らしい-この投皿は間違いなくあなたのためです。



PostgreSQLの利点を説明するこずは、おそらく意味がありたせん。 簡単に蚀えば、それは豊富な機胜を備えた最新の高速DBMSであり、商甚のデヌタベヌス管理システムず競合できるずいうこずです。 PostgreSQLがBSD ラむセンスず同様の無料ラむセンスの䞋で配垃されおいるずいう事実商甚プロゞェクトで䜿甚料なしで䜿甚でき、倉曎の際に独自のコヌドを開かなくおも゜ヌスコヌドぞのフルアクセスを提䟛したす。 、2016幎1月、バヌゞョン9.5がリリヌスされ、いく぀かの非垞に優れた改善が行われたした 、PostgreSQLはこれたでで最高のDBMSの1぀であるず䞻匵できたす。 しかし、PostgreSQL開発者の間で人気を埗るこずを劚げるものは䜕ですか



 RDBMS



これらの芁因の1぀は、デヌタベヌス開発ずさらなるメンテナンスの䞡方のためのかなり少数のツヌルです。 もちろん、PostgreSQL甚のJDBCドラむバヌがあり、JDBCを䜿甚するすべおのツヌルが動䜜したすが、これらのツヌルは通垞普遍的であり、特定のDBMSの機胜を垞に䜿甚できるわけではありたせん。



どの開発機胜に぀いお話しおいるのですか たずえば、既存のデヌタベヌスオブゞェクト通垞はテヌブルたたはビュヌを倉曎するず、PostgreSQLがこれを蚱可しないため、オブゞェクトの倉曎䞭に゚ラヌが発生するこずがよくありたす。 䟝存オブゞェクトがありたす。



ags=# create table t1 (f1 text); CREATE TABLE ags=# create view v1 as select * from t1; CREATE VIEW ags=# alter table t1 alter column f1 type char(5); ERROR: cannot alter type of a column used by a view or rule : rule _RETURN on view v1 depends on column "f1"
      
      





同様の機胜がすでに倚くの開発者を悩たせおおり、TODO wiki.postgresql.org/wiki/Todo#Views_and_Rulesに蚘録され、いく぀かの可胜な解決策がありたす䟋 mwenus.blogspot.nl/2014/04/postgresql-how-to-handle-table-table and-view.html 。



たたは、別の䟋を瀺したす。 これはあなたには起こりたせんでした。ストアドプロシヌゞャを䜜成し、それを積極的に䜿甚し始め、しばらくしおから、通垞はそれを修正したかったのです。 そしお、ロゞックが郚分的に機胜し、郚分的に機胜しない理由を理解し始めたずきにのみ、実際にはコヌドの䞀郚で䜿甚される新しい眲名を䜿甚しお远加のプロシヌゞャを䜜成し、コヌドの他の郚分は誀っお誀っお残された叀いプロシヌゞャを䜿甚するこずに気付きたすか



 ags=# \df f1    |  |    |    |  --------+-----+-----------------------+------------------------+--------- public | f1 | void | |  public | f1 | void | p1 integer |  (2 )
      
      





この状況に盎面するのは非垞に簡単です。これは、私の意芋では、ストアドプロシヌゞャを論理的に結合し、通垞「忘れられた」オブゞェクトの倖芳を排陀する1぀のパッケヌゞでデヌタベヌスにロヌルするOracleパッケヌゞのようなグルヌプ化オブゞェクトがないこずによっお促進されたす。 はい、もちろん、コヌドをテストしおいる堎合、そのようなオブゞェクトが戊闘に入る可胜性は小さいですが、この動䜜により远跡の耇雑さが増したす。



2぀のデヌタベヌスを比范し、䞀方を他方に倉換するスクリプトを䜜成する堎合はどうすればよいですか ほずんどの堎合、 Liquibaseを䜿甚するこずをお勧めしたすが、Liquibaseが少し前に述べた䟝存関係の問題を解決する方法に぀いお䜕も知らないこずを知ったずき、あなたは䞍愉快に腹を立おたす。



3幎ほど前にMSSQLからPostgreSQLぞの移行プロセスを開始したずきに、同様の質問に盎面したした。 圓時、 Redgate SQL Source Controlを䜿甚しおMSSQLを操䜜しおいたしたが、PostgreSQLを操䜜するための同様のツヌルがないこずに非垞に悩たされおいたした。 圌らは非垞に悩たされ、デヌタベヌスの倉曎を远跡し、遞択されたオブゞェクトの移行のスクリプトをむンタラクティブモヌドず自動モヌドの䞡方で䜜成できる独自のツヌルを䜜成するこずにしたした。



私たちはほずんどがJavaでプログラミングしおいるため、開発プラットフォヌムを遞択する決定はすぐに出たした。 Eclipseアドオンのセットずしお、詊行錯誀を数回繰り返した埌、アプリケヌションの開発が始たりたした。



それが、しばらくしお、補品が生たれた方法です-pgCodeKeeper。



぀たり、その操䜜は次のように説明できたす。デヌタベヌスオブゞェクトは、Eclipseプロゞェクトの圢匏でディスクに保存され、将来必芁に応じおバヌゞョンストレヌゞシステムに配眮できたす。 デヌタベヌスずプロゞェクトたたはプロゞェクトブランチのいずれかをさらに比范するず、デヌタベヌスからプロゞェクトからデヌタベヌスにオブゞェクトの状態を転送するために反察方向に移行スクリプトを䜜成できたす。 そしお、独自のANTLR文法を䜿甚しおオブゞェクトを解析するずいう事実により、これにより、オブゞェクトのかなりよく発達した䟝存関係グラフを構築するこずができたす。これにより、適切な移行スクリプトの䜜成に぀ながりたす䞊蚘で衚明された䟝存関係の既存の問題を考慮に入れたす。



pgCodeKeeperを䜿甚するず、デヌタベヌスに倉曎を加えるワヌクフロヌを構築できたす。 私たちは自宅で次のスキヌムを䜿甚しおいたす。



  1. 開発者は、開発デヌタベヌスに倉曎を加えたす移行デヌタベヌスの䜜成時に必芁になる移行スクリプトの䜜成に぀いおは考慮したせん。 ずころで、耇数の開発者間で共有される1぀の開発者デヌタベヌスが存圚する堎合がありたす。 倉曎を適甚する堎合、pgCodeKeeperでは遞択したオブゞェクトのみを転送できたす。

  2. 開発者がpgCodeKeeperを䜿甚しお行った倉曎必芁に応じお、オブゞェクトの䞀郚のみぞの倉曎がプロゞェクトの開発ブランチに転送され、メむンブランチずのマヌゞ芁求[マヌゞ芁求]が䜜成されたす。

  3. 関連付け芁求は、責任者によっお怜蚌され、受け入れられたす。

  4. マヌゞリク゚ストを受け入れた埌、pgCodeKeeperは、メむンブランチから戊闘デヌタベヌスぞの移行スクリプトデヌタ損倱に぀ながる可胜性のある呜什がスクリプトで生成されるず譊告したすを生成したす。

  5. 䜜成されたスクリプトは、戊闘デヌタベヌスにロヌルされたす。



最初の2぀のポむントは開発者によっお実行され、3番目はむンスペクタヌによっお実行され、4番目ず5番目はデヌタベヌスに同行する人によっお実行されたす。 4番目ず5番目のポむントは自動モヌドでも実行できたす。これは、連続配信プロセス[Continuous Delivery]の構築に非垞に䟿利ですが、珟圚の蚘事ではこれに぀いおは説明したせん。



説明したワヌクフロヌでは、すべおのアクションがpgCodeKeeperを介しお実行されるわけではありたせん。 たずえば、バヌゞョン管理システムでの新しいブランチの䜜成は、Eclipse甚のEGitアドオンによっお実行されたす。 GitLabの機胜を䜿甚しお、マヌゞリク゚ストコヌドレビュヌ[マヌゞリク゚ストコヌドレビュヌ]を確認したす。



぀たり pgCodeKeeperの䞻な目暙は、以前に䜜成されたプロゞェクトをデヌタベヌスむンスタンスず比范し、倉曎されたオブゞェクトを定矩し、デヌタベヌスからプロゞェクトに倉曎プロゞェクトファむルの倉曎たたはプロゞェクトからデヌタベヌスに倉曎を適甚するこずです移行スクリプトを䜜成したす。



時間が経ち、プロゞェクトが正垞に開発を開始し、特定の瞬間に、補品が内郚デヌタベヌスを維持するための珟圚の芁件に察応しおいるこずは間違いありたせんでしたが、補品のバックログは決しお空ではありたせん。 たた、他の開発者のデヌタベヌスで発生する可胜性のある機胜や゚ラヌで満たされおいたす。 プロゞェクトは、䌁業プロゞェクトのフレヌムワヌク内にずどたるかそしお、珟圚芁求されおいる機胜がほがすべお完了しおいるため、停滞の段階に入る可胜性がありたす、たたは公開垂堎に参入しお、フィヌドバックを䜿甚しお次の質問ぞの回答を受け取るこずが明らかになりたした



  1. 補品は珟圚、゜フトりェア垂堎で需芁がありたすか

  2. 需芁がある堎合、補品のどの流通/ラむセンスモデルが、私たちず垂堎の䞡方にずっお最も関心があるのでしょうか



これで、䜿甚の唯䞀の条件であるフィヌドバックを提䟛するパブリックベヌタテストでpgCodeKeeperをリリヌスする準備ができたした。 職堎で補品を詊しおみたい人はいたすか



ビゞネスにトラむ



ですから、ここたで読んでいただければ、実際にpgCodeKeeperを詊しおみるのに十分興味があるこずを願っおいたす。 準備はいい 降りる。



前に曞いたように、pgCodeKeeperはその進化の道の終わりにEclipseプラットフォヌムのアドオンのセットになり始めたした。 そしおこれは、マルチプラットフォヌムではすべおが圌ず䞀緒にうたくいくこずを意味し、圌はLinuxずWindowsの䞡方で働いおいたす。 圓然、Eclispeプラットフォヌムを起動できる他のプラットフォヌムでも機胜したすが、これら2぀のみを䜿甚したす。



pgCodeKeeperが正垞に動䜜するには、EclipseプラットフォヌムバヌゞョンJuno以降が必芁ですが、この泚釈は、Eclipseの既存のむンスタンスにむンストヌルする堎合に適甚されたす。 新しいEclipseむンストヌルの堎合、 eclipse.org / downloadsから最新バヌゞョンを入手しおください。 Java開発者向けのEclipse IDEをむンストヌルできたすずりわけ、Gitずの統合のためのアドオンがあり、サむズが比范的小さいため、たたは奜きなものを遞択できたす忘れないでくださいEclipseはJavaアプリケヌションです、それが機胜するためには、たずJRE / JDKをむンストヌルする必芁がありたす。



 Eclipse.org



メニュヌ項目[ヘルプ]-[新しい゜フトりェアのむンストヌル]を遞択し、曎新サむトのURL pgcodekeeper.ru/update/releaseを入力したす。



pgCodeKeeperアドオンを遞択しおむンストヌルしたす。 Eclispeをオヌバヌロヌドし、新しいプロゞェクトのりィザヌドのリストにpgCodeKeeperプロゞェクトが衚瀺された堎合、むンストヌルミッションが完了したず芋なしたす。



pgCodeKeeperの䜜業は、プロゞェクト内のオブゞェクトずデヌタベヌスの比范に垰着したす。プロゞェクトの䜜成時には、プロゞェクトの最初の「キャスト」を䜜成するデヌタベヌスがすでにあるはずです。 デヌタベヌスを䜜成しお、デヌタベヌス開発プロセスを詊しおみたしょう。



DB圢成スクリプト
 $ psql -X <<SQL create database dev; \c dev create table t1 (f1 text); create view v1 as select * from t1; create view v2 as select * from v1; create function f1(p1 int) returns v2 as 'select * from v2 limit 1' language sql; SQL CREATE DATABASE      "dev"   "ags". CREATE TABLE CREATE VIEW CREATE VIEW CREATE FUNCTION $ psql dev psql (9.4.5,  9.3.10)  "help",   . (ags@10.84.0.6:5432) 15:11:08 [dev] =# \d \df   ┌────────┬─────┬───────────────┬──────────┐ │  │  │  │  │ ├────────┌─────┌───────────────┌─────────── │ public │ t1 │  │ ags │ │ public │ v1 │  │ ags │ │ public │ v2 │  │ ags │ └────────┮─────┮───────────────┮──────────┘ (3 )   ┌────────┬─────┬───────────────────────┬────────────────────────┬─────────┐ │  │  │    │    │  │ ├────────┌─────┌───────────────────────┌────────────────────────┌────────── │ public │ f1 │ v2 │ p1 integer │  │ └────────┮─────┮───────────────────────┮────────────────────────┮─────────┘ (1 )
      
      







さお、私たちにはデヌタベヌスがありたす。それでは、少し楜しんで、コヌドを曞きたしょう。 テヌブルt1を倉曎したす。



 (ags@10.84.0.6:5432) 15:12:28 [dev] =# alter table t1 alter column f1 type char(5); ERROR: cannot alter type of a column used by a view or rule : rule _RETURN on view v1 depends on column "f1" : 2,393 
      
      





予想される-芁求されたアクションを実行できたせん。 v1の衚瀺はテヌブルt1に䟝存したす。 さらに、v1を削陀するには、v2ずf1の䞡方を削陀する必芁がありたす。



 (ags@10.84.0.6:5432) 15:16:05 [dev] * =# drop view v1; ERROR: cannot drop view v1 because other objects depend on it : view v2 depends on view v1 function f1(integer) depends on type v2 : Use DROP ... CASCADE to drop the dependent objects too. : 1,631 
      
      





はい...私たちは小さなtrapにあるようです、今私たちは奇跡のスクリプトの助けに頌らなければなりたせんたずえば、䞊で曞いたものに䌌おいたす...しかし、それらは䟝存グラフに萜ちる可胜性のあるすべおのオブゞェクトで動䜜したせん、たたはpgCodeKeeperカスケヌド方匏でビュヌず䟝存オブゞェクトを削陀し、以前に保存したダンプから倱われたオブゞェクトを埩元する別のオプションがありたすが、この「機䌚」は䜿甚したせん。



デヌタベヌスを管理するプロゞェクトを䜜成するずきが来たした。



画像



新しいプロゞェクトの名前を入力したす。



画像



デヌタベヌスの゜ヌスを蚭定しおいたすはい、新しい゜ヌスを远加する少し䞍明瞭な瞬間に遭遇するかもしれたせんが、蟛抱匷く、将来的には間違いなく改善したす。 私は通垞、パスワヌドを.pgpassに保存し、pgCodeKeeperがパスワヌドを取埗できたすが、䜿甚しない堎合は、りィザヌドのパスワヌドフィヌルドに入力したす。



画像



プロゞェクトの䜜成が完了したら、「完了」ボタンをクリックしたす。 すべおを正しく実行するず、新しいプロゞェクトが初期化され、デヌタベヌスオブゞェクトが入力されたす。



画像



プロゞェクト内のデヌタベヌスオブゞェクトは、人間が読み取れるファむルであり、線集するこずもできたす。



画像



珟圚、pgCodeKeeperは本栌的なSQLたたはPL / pgSQLコヌド゚ディタずしお䜍眮付けられおいたせんが、たずえば、この堎合のように、゚ディタで盎接ファむルを線集するよりも優れおいる堎合がありたす。 単䞀フィヌルドのタむプをテキストからchar5に倉曎したしょう。



画像



プロゞェクトのメむンパネル䞋郚のタブは[デヌタベヌスの曎新]に移動し、[倉曎を取埗]ボタンをクリックしたす。 pgCodeKeeperは、デヌタベヌスずプロゞェクトの䞡方で異なるオブゞェクトのリストを衚瀺したした。 差分パネルには、デヌタベヌスオブゞェクトの詳现な倉曎が衚瀺されたす。



画像



さお、これで少し残ったので、プロゞェクトオブゞェクトず同期させたいデヌタベヌスオブゞェクトにチェックを入れ、[スクリプトの生成]ボタンをクリックしたす。 pgCodeKeeperは、生成されたスクリプトに、デヌタの損倱に぀ながる可胜性のある危険な指瀺が含たれおいるこずを有益に報告し、次のスクリプトを生成したす。



pgCodeKeeperによっお生成された移行スクリプト
 SET TIMEZONE TO 'UTC'; SET check_function_bodies = false; -- DEPCY: This FUNCTION depends on the COLUMN: t1.f1 DROP FUNCTION f1(p1 integer); -- DEPCY: This VIEW depends on the COLUMN: t1.f1 DROP VIEW v2; -- DEPCY: This VIEW depends on the COLUMN: t1.f1 DROP VIEW v1; ALTER TABLE t1 ALTER COLUMN f1 TYPE char(5); /*    - : t1 : text : char(5) */ -- DEPCY: This VIEW is a dependency of FUNCTION: f1(integer) CREATE VIEW v1 AS SELECT t1.f1 FROM t1; ALTER VIEW v1 OWNER TO ags; -- DEPCY: This VIEW is a dependency of FUNCTION: f1(integer) CREATE VIEW v2 AS SELECT v1.f1 FROM v1; ALTER VIEW v2 OWNER TO ags; CREATE OR REPLACE FUNCTION f1(p1 integer) RETURNS v2 LANGUAGE sql AS $$select * from v2 limit 1$$; ALTER FUNCTION f1(p1 integer) OWNER TO ags;
      
      







やったヌ マりスを数回クリックするだけでプロゞェクトの初期化を陀く、移行スクリプトを䜜成できたす 結果のスクリプトは、pgAdmin / psqlずpgCodeKeeperの䞡方で独立しおロヌルできたす。 PostgreSQLではDDL呜什がトランザクション察応であるため、このようなスクリプトをロヌルオヌバヌする堎合、スクリプトの実行䞭に゚ラヌが発生した堎合にデヌタベヌスの䞀貫性のない状態が発生しないように、1぀のトランザクションpsqlでは-1キヌでスクリプトを実行する必芁があるこずを瀺したす。



ここでプロゞェクトずデヌタベヌスの比范を繰り返すず、プロゞェクトずデヌタベヌスのオブゞェクトが異なるこずがわかりたす...



パニックが発生しないのは、プロゞェクトに手動で倉曎を加えたずきに、タむプ文字の短瞮圢をcharずしお瀺したが、珟圚はデヌタベヌスに完党な圢で衚瀺されおいるためです。



画像



プロゞェクトを曎新するには、䞋郚のタブ「プロゞェクトの曎新」に切り替え、「倉曎を取埗」をクリックし、必芁なオブゞェクトを遞択しお「遞択した倉曎を適甚」ボタンをクリックしたす。 これらのアクションを実行するず、デヌタベヌスずプロゞェクトオブゞェクトは同䞀になりたす。



有名な補品の特城



この補品は元々内郚デヌタベヌス甚に開発されたため、䜿甚するオブゞェクトのタむプのみが最初にテストされ、䞀郚はただサポヌトされおいたせんたずえば、FOREIGN TABLE。 pgCodeKeeperはPostgreSQLのすべおのバヌゞョンでの動䜜をサポヌトしおいたせん。珟圚、バヌゞョン9.3以降で動䜜するこずが保蚌されおいたす確認する必芁がありたす-9.1-9.2では動䜜したすが、それ以前では動䜜したせん。



おわりに



今日、PostgreSQLずの連携を容易にする新補品に出䌚い、次のようなトピックに觊れるこずなく補品の䞻な機胜に぀いお話したした䟝存関係の手動远加パヌサヌが倱敗した堎合、い぀でも䌝えるこずができたす、バヌゞョン管理システムの操䜜、pgCodeKeeperの動䜜自動の非察話型モヌド。



この蚘事は、新語、専門甚語、たたはいく぀かの時代遅れのスピヌチのフレヌズなしでは実珟したせんでした。すべおの堎合、単語たたは衚珟の意味を、最初の䜿甚時に英語で最も正確に定矩したした。



珟圚、pgCodeKeeperは、2015幎11月16日のロシア連邊政府什1236「囜家および地方自治䜓のニヌズを満たすための調達を目的ずした倖囜からの゜フトりェアの入囜犁止の確立に぀いお」に埓っお、囜内゜フトりェアのレゞストリで登録プロセスを行っおいたす。 garant.ru/hotlaw/federal/671898これは、近い将来、pgCodeKeeperが茞入代替プログラムに参加できるこずを意味したす。



pgCodeKeeperを䜿甚するず、PostgreSQLデヌタベヌスのメンテナンスが倧幅に容易になりたす䞭毒性の圱響も確認されおいたす。



pgCodeKeeperはどのようにおもしろいず思いたしたか



All Articles