11

elixir/sqlalchemyを使用してデータを保存するPythonアプリケーションを作成しました。ソフトウェアの2番目のリリースでは、テーブルと列を追加/削除するために、以前のバージョンで作成されたファイルを更新する必要があります。

私の質問は、どうすればこれを達成できるかということです。私はsqlalchemy-migrateを知っていますが、混乱していると言わざるを得ません。既存のデータがどうなるかについては触れられていません。さらに、sqliteはALTER TABLEのサポートを減らしたので、列を削除しようとすると移行はどうなりますか?移行を使用する他のアプローチはありますか?

4

3 に答える 3

8

あなたが話しているのは、よく知られた非常に複雑な問題です。これは、データベース移行と呼ばれます。すべての優れたプロジェクトには、ある製品バージョンから別の製品バージョンに進むためにデータベーススキーマとデータミューテーションをどのように適用するかを説明するポリシーがあります。

DjangoやRubyonRailsなどの多くのフレームワークには、移行システムが組み込まれているか、プラグインとして利用できます。SQLAlchemyのケースには、いくつかのオプションがあります。

  1. システムを使用しないでください。/tmp/migrate.sql手で書き、ALTER / DROP / CREATEステートメントを書き留め、指を交差させてSQLiteベースに適用するだけです。エラーが発生しやすいため、一般的には悪い考えですが、選択はあなた次第です。フル機能のALTER TABLEステートメントがない場合は、一時的な名前で目的のプロパティを持つ新しい列を作成し、元の列からその列にすべてのデータをコピーし、元の列を削除し、新しい列の名前を元の名前に変更することで回避できます。同じ手法をテーブルレベルで使用できます。
  2. liquibaseなどのサードパーティの移行システムを使用します。Liquibaseは、1つの欠点を除いて、クールで、うまく設計され、強力です。本当にバグがあります。私はSQLiteでそれを試しました(そしてSQLAlchemyでもそうですが、実際には問題ではありません)、そしてそれはいくつかのかなり基本的なことをすることができませんでした。問題をグーグルで検索したところ、既知のバグであることがわかりました。
  3. SQLAlchemyを使用してください-あなたが言及した移行。それは、それが触発されたROR移行ほど強力ではなく、liquibaseほど強力でもありませんが、機能します。SQLiteの制限も同じように回避できます。

そして、列を削除しようとした場合にSQLAlchemy-migrateが何をするかについて質問しました。さて、それは列を削除するので、その中にあったすべてのデータを削除します。テーブル内の他の列はそのまま残ります。

于 2010-04-16T14:47:13.557 に答える
5

sqlalchemy-migrateのより最近の代替手段は、SQLAlchemyの作者自身によって書かれたalembicです。後者(「同じ作成者」)は強力な議論のように見えますが、欠点は、SQLiteを使用したテーブルALTERationをサポートしていないことです。つまり、SQLiteのALTERサポートが欠落しているための回避策が組み込まれていません。(これは範囲外であり、専用のpythonパッケージまたはSQLite拡張機能で解決できると主張する人もいるかもしれません。)

于 2012-05-16T09:26:46.340 に答える
0

sqlalchemy-migrateであなたを混乱させるものは何ですか?何をするかをプレビューするための--preview_sqlおよび--preview_pyオプションがあります。一般に、考えられるすべての場合に適切な移行を行うことは不可能ですが、必要に応じて生成された移行スクリプトを変更できます。試してみると、残りの答えを簡単に得ることができます。

于 2010-04-16T14:41:57.260 に答える