データベースのバージョン管理にどのような方法を使用していますか? すべてのデータベース テーブルを個別の .sql スクリプトとしてリポジトリ (mercurial) にコミットしました。そうすれば、たとえば、チームのメンバーが従業員テーブルを変更した場合、リポジトリを更新したときに変更された特定のテーブルがすぐにわかります。
このような方法については、「コード制御下のデータベース スクリプトのベスト プラクティスとは」で説明されています。現在、データベース フォルダー内のすべての .sql ファイルを実行する python スクリプトを作成していますが、外部キー制約による依存関係の問題により、.sql ファイルを任意の順序で実行することはできません。
Python スクリプトは、.sql ファイルを実行する順序でファイルを生成することです。tableorder.txt ファイルに表示される順序で .sql ファイルを実行します。テーブルは、その外部キー テーブルが実行されるまで実行できません。次に例を示します。
tableorder.txt
table3.sql
table1.sql
table7.sql など
既に、"show create table" mysql コマンドの結果を解析して、コードから各テーブルの依存関係リストを生成しています。依存関係リストは次のようになります。
tblstate: tblcountry //tblcountry.sql must be executed before tblstate.sql etc
tblemployee: tbldepartment, tblcountry
tableorder.txt のコンテンツを生成するには、次のようなアルゴリズムが必要です。
function print_table(table):
foreach table in database:
if table.dependencies.count == 0
print to tableorder.txt
if table.dependencies.count > 0
print_table(dependency) //print dependency first
end function
ご想像のとおり、これには多くの再帰が含まれます。努力する価値があるかどうか疑問に思い始めています。そこにツールがあれば?依存関係を考慮して個別の .sql テーブルとビューを実行する順序のリストを生成するツール (またはアルゴリズム) は何ですか? テーブル/ビューごとに個別の .sql ファイルをバージョン管理する方が良いですか、それともデータベース全体を単一の .sql ファイルにバージョン管理する方が良いですか? これには何日もかかったので、どんな返事でも感謝します。ありがとう。