62

sqlalchemyを使用してWebアプリケーションをプログラミングしています。サイトが本番環境にないときの開発の最初のフェーズでは、すべてがスムーズでした。古いsqliteデータベースを削除し、新しいデータベースを最初から作成するだけで、データベーススキーマを簡単に変更できます。

現在、サイトは本番環境にあり、データを保持する必要がありますが、データベースを新しいスキーマに簡単に変換することで、元の開発速度を維持したいと考えています。

したがって、データベースのスキーマを記述した、リビジョン50のmodel.pyとリビジョン75のmodel.pyがあるとします。これらの2つのスキーマの間では、ほとんどの変更は簡単です。たとえば、新しい列がデフォルト値で宣言されており、このデフォルト値を古いレコードに追加したいだけです。

最終的には、いくつかの変更は簡単ではなく、事前の計算が必要になる場合があります。

たとえば、1日に1つまたは2つの新しいバージョンの製品コードを使用して、急速に変化するWebアプリケーションをどのように処理しますか(または処理しますか)。

ちなみに、これで違いがあれば、サイトはパイロンで書かれています。

4

4 に答える 4

43

Alembicは、SQLAlchemyの作成者によって作成された新しいデータベース移行ツールです。sqlalchemy-migrateよりもはるかに使いやすいことがわかりました。また、Flask-SQLAlchemyとシームレスに連携します。

SQLAlchemyモデルからスキーマ移行スクリプトを自動生成します。

alembic revision --autogenerate -m "description of changes"

次に、新しいスキーマの変更をデータベースに適用します。

alembic upgrade head

詳細はこちら: http: //readthedocs.org/docs/alembic/

于 2012-11-20T05:32:09.453 に答える
16

私達がすること。

  1. アプリケーションの「メジャーバージョン」。「マイナーバージョン」IDを使用します。メジャーバージョンはスキーマのバージョン番号です。主要な数は、ランダムな「十分な新機能」のようなものではありません。これは、データベーススキーマとの互換性の正式な宣言です。

    リリース2.3と2.4はどちらもスキーマバージョン2を使用します。

    リリース3.1はバージョン3スキーマを使用します。

  2. スキーマバージョンを非常に見やすくします。SQLiteの場合、これはデータベースファイル名にスキーマバージョン番号を保持することを意味します。MySQLの場合、データベース名を使用します。

  3. 移行スクリプトを作成します。2to3.py、3to4.py。これらのスクリプトは2つのフェーズで機能します。(1)古いデータを新しい構造にクエリして、単純なCSVまたはJSONファイルを作成します。(2)それ以上の処理を行わずに単純なCSVまたはJSONファイルから新しい構造をロードします。これらの抽出ファイルは、適切な構造になっているため、読み込みが速く、単体テストのフィクスチャとして簡単に使用できます。また、2つのデータベースを同時に開くことはありません。これにより、スクリプトが少し簡単になります。最後に、ロードファイルを使用して、データを別のデータベースサーバーに移動できます。

スキーマの移行を「自動化」することは非常に困難です。自動化されたスクリプトでは古いスキーマから新しいスキーマにデータを簡単にマッピングできないほど、データベースの操作を非常に深く行うのは簡単です(そして一般的です)。

于 2010-11-12T14:14:32.477 に答える
13

sqlalchemy-migrateを使用します。

これは、データベース設計へのアジャイルアプローチをサポートするように設計されており、スキーマの変更が必要なため、開発データベースと本番データベースの同期を容易に保つことができます。スキーマのバージョン管理が簡単になります。

これは、データベーススキーマのバージョン管理と考えてください。各スキーマ変更をそれにコミットすると、スキーマバージョンを前後に移動できるようになります。そうすれば、クライアントをアップグレードでき、そのクライアントのデータベースに適用する変更のセットを正確に知ることができます。

それはS.Lottがあなたのために自動的に彼の答えで提案することをします。難しいことを簡単にします。

于 2010-11-12T14:28:09.637 に答える
0

問題に対処する最善の方法は、宣言的な方法ではなく、スキーマを反映することです。ここにリフレクティブアプローチに関する記事を書きました:http: //petrushev.wordpress.com/2010/06/16/reflective-approach-on-sqlalchemy-usage/ しかし、これに関する他のリソースもあります。このように、スキーマに変更を加えるたびに、アプリを再起動するだけで、リフレクションがテーブルの変更の新しいメタデータをフェッチします。これは非常に高速で、sqlalchemyはプロセスごとに1回だけ実行します。もちろん、自分で行った関係の変更を管理する必要があります。

于 2010-11-12T15:30:51.683 に答える