web-dev-qa-db-ja.com

sqlalchemy-migrateを使用する価値はありますか?

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

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

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

 success !

つまり、スキーマが一貫性のある状態になっているかどうかもチェックしませんでした。したがって、migrateを使用する価値はありますか?グッドプラクティスに関連するDo It Yourselfメソッドと比較して利点はあります S.Lottによって提案されたとおり) ? sqlalchemy-migrateに代わる方法はありますか?実際に移行プロセスを単純化していますか、それとも悪いaprioriで移行を使用しようとしていますか?上記のリンクで提案されているCSV列)?

どうもありがとう!

46
ascobol

代わりにAlembicを使用してください:

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

コメントをありがとう、何らかの理由を追加するために編集-

これはSQLAlchemyの作成者によって開発されたもので、まったく新しく、十分にサポートされています。 sqlalchemy-migrateについて十分に理解していないため、適切な比較を行うことができません。しかし、私は明確で簡潔なAlembicのドキュメントをざっと読んでから、独自の自動生成マイグレーションを非常に短時間で実行しました。

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

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

69
cdaddr

Alembicがリリースされ( http://pypi.python.org/pypi/alembic )、SQLAlchemyの作成者によって保守され、sqlalchemy-migrateの開発が停止しているように見えるという事実があり、今年はほぼコミットされていません(- http://code.google.com/p/sqlalchemy-migrate/source/list )、それを使用する価値はないと思いますこれ以上、現在のプロジェクトをAlembicに切り替えます。

それが頻繁に維持されている場合、プロジェクトがSQLAlchemyと同期を維持できることには自信があります(以前はそうでした)。

8
Kel Solaar

個人的には気に入っています。新規インストール(dev、test、prod)は非常に簡単にブートストラップできるため、すばらしいです。それだけでなく、アプリケーションの成長に合わせてアプリのホームを提供し、アプリケーションのバージョン間を移動するときに実行する必要がある移行のための適切なエントリポイントを提供します。開発、テスト、および本番サーバーで変更/その他を実行する必要があります。

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

個人的に私はそれを使用してbootstrapユニットテストを実行するためにsqlite dbを使用してpylonsで私のユニットテストを行っていますが、本番環境ではmysqlを使用しています。

3
Rick