あなたが話しているのは、よく知られた非常に複雑な問題です。これは、データベース移行と呼ばれます。すべての優れたプロジェクトには、ある製品バージョンから別の製品バージョンに進むためにデータベーススキーマとデータミューテーションをどのように適用するかを説明するポリシーがあります。
DjangoやRubyonRailsなどの多くのフレームワークには、移行システムが組み込まれているか、プラグインとして利用できます。SQLAlchemyのケースには、いくつかのオプションがあります。
- システムを使用しないでください。
/tmp/migrate.sql
手で書き、ALTER / DROP / CREATEステートメントを書き留め、指を交差させてSQLiteベースに適用するだけです。エラーが発生しやすいため、一般的には悪い考えですが、選択はあなた次第です。フル機能のALTER TABLE
ステートメントがない場合は、一時的な名前で目的のプロパティを持つ新しい列を作成し、元の列からその列にすべてのデータをコピーし、元の列を削除し、新しい列の名前を元の名前に変更することで回避できます。同じ手法をテーブルレベルで使用できます。
- liquibaseなどのサードパーティの移行システムを使用します。Liquibaseは、1つの欠点を除いて、クールで、うまく設計され、強力です。本当にバグがあります。私はSQLiteでそれを試しました(そしてSQLAlchemyでもそうですが、実際には問題ではありません)、そしてそれはいくつかのかなり基本的なことをすることができませんでした。問題をグーグルで検索したところ、既知のバグであることがわかりました。
- SQLAlchemyを使用してください-あなたが言及した移行。それは、それが触発されたROR移行ほど強力ではなく、liquibaseほど強力でもありませんが、機能します。SQLiteの制限も同じように回避できます。
そして、列を削除しようとした場合にSQLAlchemy-migrateが何をするかについて質問しました。さて、それは列を削除するので、その中にあったすべてのデータを削除します。テーブル内の他の列はそのまま残ります。