50

sqlalchemy (Pylons 内) を使用する Web アプリケーションがあります。データを失うことなく、少なくとも毎日、場合によってはそれ以上、本番バージョンを変更できるように、スキーマを効率的に変更する必要があります。

週末に sqlalchemy-migrate を少し使ってみましたが、悪い印象を受けたと思います。まず、2 つのデータベース エンジン間の移行には役立たないと思います。それはおそらく sqlalchemy だけでできることです。次に、ドキュメントが最新ではないようです。各コマンドでリポジトリ パスを指定するなど、いくつかのコマンド ライン オプションを変更する必要がありました。これは移行のバグである可能性があります。

しかし、最悪なのは「manage.py test」コマンドです。実際にデータベースを変更するだけでなく(この点はドキュメントに明確に示されているため、移行を非難することはできません)、最初の移行スクリプトは単純な愚かなスキーマ移行を行い、アップグレードされダウングレードされたデータベースを元のスキーマとは異なるままにしました。しかし、「manage.pyテスト」は次のような答えを出しました

 success !

つまり、スキーマが一貫した状態のままかどうかもチェックしませんでした。では、移行を使用する価値はありますか? S.Lott によって提案されたグッド プラクティスに関連する Do It Yourself メソッドと比較して、利点はありますか? 実際に移行プロセスを簡素化する sqlalchemy-migrate の代替手段はありますか、それとも私は単に移行を先験的に悪い方法で使用しようとしていますか?

どうもありがとう!

4

3 に答える 3

79

代わりに Alembic を使用します。

http://pypi.python.org/pypi/alembic

コメントをありがとう、いくつかの理由を追加するために編集されました -

これは SQLAlchemy の作成者によって開発されたもので、真新しく、十分にサポートされています。私は sqlalchemy-migrate についてよく知りません。しかし、明確で簡潔な Alembic のドキュメントをざっと読んだだけで、自動生成された独自の移行が非常に短時間で機能するようになりました。

自動生成: 唯一の操作モードではありませんが、選択した場合、Alembic はアプリケーションの sqlalchemy 構成 (たとえば、すべてのテーブル、制約、およびマッピングを設定する宣言型モデル クラス) を読み取り、実際の現在の状態と比較します。データベースを作成し、2 つの間の差分を表す Python スクリプトを出力します。次に、そのスクリプトを Alembic のアップグレード コマンドに渡すと、違いが解決されます。通常、移行スクリプトを手動で少し編集する必要があります。これは、(a) 移行の性質にすぎず、(b) 移行の正確な手順を完全に認識していることを確認するためにとにかくやりたいことです。実行する前に実行します。

Alembic は、移行を追跡する方法にも DVCS のような機能をもたらします。これにより、db スキーマの過去の状態に簡単に戻ることができます。

于 2012-06-07T01:01:22.493 に答える
9

Alembic は公開されており ( http://pypi.python.org/pypi/alembic )、SQLAlchemy の作成者によって維持されており、sqlalchemy-migrate の開発が停滞しているように見え、今年は実質的にコミットがありません ( http://code.google. com/p/sqlalchemy-migrate/source/list )、もう使う価値はないと思います。現在のプロジェクトを Alembic に切り替えます。

それがまだ十分に維持されていれば、プロジェクトがSQLAlchemyと同期を保つ能力に自信があります(以前はそうでした).

于 2012-10-23T07:58:15.883 に答える
3

私は個人的にそれを使用するのが大好きです。新しいインストール (dev、test、prod) を非常に簡単にブートストラップできるため、これは素晴らしいことです。それだけでなく、アプリケーションの成長に合わせてホームを提供し、アプリケーションのバージョンからバージョンへの移行に必要な移行の適切なエントリ ポイントを提供します。dev、testing、および production サーバーで、alter/etc を実行する必要があります。

完璧ですか?いいえ。データベースを悪い状態のままにしておくことができますが、それが開発/テスト/本番バージョンのものを持っている理由です。

個人的には、単体テストを実行するために sqlite db を使用して pylons で単体テストをブートストラップするために使用していますが、本番環境では mysql を使用しています。したがって、それを使用するクロス db プラットフォームの利点がいくつかあります。

于 2010-11-18T01:07:04.557 に答える