2012-03-29 9 views
4

トリガー、ビュー、関数、CTEなどを使用して、データベースにロジックを移し始めました。plv8/jsonがpostgresのために出てきたとき、そこに多くのロジックを入れています。データベースの変更を管理する

私はsequelとactiverecordでデータベース移行を行う「標準的な」方法に問題があります。 sequelとactiverecordの両方で、任意のSQLコードをタイムスタンプ付きファイルに入れることができます。各ファイルが実行されると、schema_versionsテーブルがファイル名(またはファイル名のタイムスタンプ)で更新され、現在のデータベースに適用された移行の記録が保持されます。既存のビューの変更、機能などは、以下のパターンに従うことを意味

コーディングの多くは、データベース・レベルで行われている場合、:

をマイグレーション1はそれを使用して機能し、ビューを定義します関数。

-- Migration 1 
create function calculate(x int) returns int as $$        
    return x + 1;                 
$$ language sql;                 

create view foos as (               
    select something, calculate(something) from a_table       
); 

要件が変更され、機能タイプを変更する必要があります。 マイグレーション2私はfooに依存するすべてのオブジェクトを削除し、他のコードのほとんどに変更がなかったとしても、ボディ全体をコピーして再作成する必要があります。

-- Migration 2                

-- Have to drop all views and functions that depend on the     
-- `calculate(int)` function.            
drop view foos;                
create or replace calculate(x bigint) returns bigint as $$     
    return x + 1;                
$$ language sql;                

-- I could do `drop function calculate(int) cascade`,      
-- but I might accidentally drop some objects that wouldn't get recreated below. 

-- Now I have to recreate foo.            
create view foos as (              
    select something, calculate(something) from a_table      
); 

私は私のマイグレーションが重複したコードで満たされるでしょう、ビューおよび関数やトリガに基づいてシステムを構築しています、そしてそれは、コードの最新バージョンを見つけることが難しい場合。私の目的(電子商取引、船積み、取引)では、ロジックを実行してデータベースにデータの整合性を保証するのがずっと簡単で速いことが分かっていますデータベース内

現在のデータベーススキーマ(すべてのコード定義を含む)をダンプできますが、コメントを失うと思います。また、スキーマ全体を含む巨大なファイルを編集することは一般的ではありません。

どのようにこの問題を解決するためのアイデアですか?

私の最高のアイデアは、独自の標準的なファイル(アプリ/ SQL /受注/ shipping.sql、アプリ/ SQL /受注/ creation.sql、など)に含まれるどのようにSQLコードにあります。誰もがこれらの上で直接開発する。リリース時期になると、新しい移行ファイルを作成し、以前のリリースから変更されたコードをすべて見て、削除して再作成する必要があるデータベースオブジェクトの依存関係チェインを見つけてからコピーします正規のsqlファイルから新しいsequel/activerecord移行ファイルへのsqlしかし、それは痛みです。 :/

非常に歓迎されています。私はこれを十分に説明して、私はカフェインの摂取量を減らしたいと思っています。私はちょっとした気分です。

ああ、私は、スタックオーバーフロー上で同様の質問を:Changing the type of a column used in other views答えは私が中に通過させる機能だった:

をドロップして再作成する
  • データベースビューを実行するためのSQLコードを

    関数は、(ドロップの逆の順序で)ビュー定義を再作成、SQLコードを実行し、ビューをドロップし、ビューの定義を取得します。おそらく、このような関数のシステムは、移行コードにSQLコードをコピー/ペーストする必要があるという問題を解決するのに役立ちます。

  • +0

    https://github.com/nkiraly/DBStewardはこの問題を解決する興味深いアプローチのようです。 –

    +0

    こんにちは、私はDBStewardの共同管理者です。この質問をしてから4年近く経っていますが、まだDBStewardを積極的に開発しています。私はあなたがDBStewardを使っていたのか、それとも終わっていないのか、それがあなたの経験であったのか、それがあなたの問題を解決しなかったのかを知りたいと思っています。 –

    答えて

    4

    liquibaseをお勧めします。

    データベースの変更を追跡するファイルを作成します。これらのファイルは、正しい移行順序でデータベースに実行されます。

    1

    あなたはここから始まる面白いデイブ・ウィーラーのブログ - の記事を見つけるかもしれない:データベース変更の

    http://justatheory.com/computers/databases/simple-sql-change-management.html

    私のレートはかなり小さいですが、私はそう、不注意なことと直接スキーマに小さな変更を加える傾向にあります私はそうした時に捕まえるためにかなりのインフラを考えなければならなかった。基本的な要素は次のとおり

    1. スクラッチ
    2. 「モジュール」(lookups_schema.sql、lookup_data.sql)に分離スキーマファイルのセットから開発データベースを再構築することができ、メイクファイル
    3. の組更新は、私は通常、対応するダウングレードスクリプトを持っていない1つのリビジョンから次の
    4. への移行をファイル、一部の人々は、
    5. テストデータの妥当な量
    6. 決定的と私のデータベースを作成するためのスクリプトを実行します私のさまざまな機能、ビュー、およびアップグレードスクリプトをチェックするpgTAP経由のテストスイート。アップグレードテストはライブデータベースに対しても実行できます。あなたが持っている場合にfsyncはその後、全体のDBを再構築し、(あなたがあまりにも多くのテストデータを持っていない場合)、それは秒を取ることができ移入RAMディスク等のオン/オフを

    は、PostgreSQLの別のインスタンスを設定します。

    #1、#2で開始し、次に#6を追加します(pgTAPは非常にです)。重要なのは、データベース内のコードをチェックするテストスイートです。

    スキーマの変更を自動化しようとするツールがありますが、実際にはテーブルに新しい列を追加するだけです。一度あなたのデータベースにコードがあれば、あまり役に立ちません。

    関連する問題