トリガー、ビュー、関数、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コードをコピー/ペーストする必要があるという問題を解決するのに役立ちます。
https://github.com/nkiraly/DBStewardはこの問題を解決する興味深いアプローチのようです。 –
こんにちは、私はDBStewardの共同管理者です。この質問をしてから4年近く経っていますが、まだDBStewardを積極的に開発しています。私はあなたがDBStewardを使っていたのか、それとも終わっていないのか、それがあなたの経験であったのか、それがあなたの問題を解決しなかったのかを知りたいと思っています。 –