2017-12-23 52 views
0

でマップしています。SQLAlchemyとAlembicの移行をバックエンドのPostgres DBとともに使用しています。私はいくつかのDBモデルで列挙型をデータ型として使用してきましたが、私はSQLAlchemyでEnum-Typeを使用していました。継続的な開発の中で、新しい値を追加する際の柔軟性の高さなど、整数を使用してこれらの列挙型を置き換えることにしました。データ型を変更して、データ型を変更する必要があります。列挙型は、int型よりも他のdbシステムへの移植性が低いようです)。このため、列挙型列のデータ型を、アレムビクスの移行を使用してint型に変更するため、移行を作成する必要があります。Postgres/SQLAlchemy/Alembicはデータ型をenumからintに変更し、値を

悲しいことに、悲しいことに、変換方法がまだ見つかりませんでした。これにより、移行中に古い値を保持できます。私はIntEnumsを使用しています。これはpythonで列挙型の値を整数にマップしていますが、Postgresはこのマッピングを内部的に使用しないため、整数に変換するときの列挙型の推定値に関する情報はありません。私の見解では、alter tableクエリを適用するときに、何らかの形で整数にenum-nameを明示的にマッピングする必要があります。 Postgresはusingステートメントを提供していますが、これを使用してenum-valuesの値をPythonが使用していた新しい/古い整数値にマップする方法を見つけることができませんでした。

このようなステートメントを使用すると、以前の(列挙型の)値を新しい(int型の)値にマップする必要がありますか?

、このような列挙型の例:(DBにおける旧)

class SexEnum(enum.IntEnum): 
    male = 0 
    female = 1 

カラム:(新)

sex = db.Column(db.Enum(SexEnum)) 

コラム:

sex = db.Column(db.Integer) 

移行コマンド今:

op.alter_column('users', 'sex', 
      type_=sa.Integer, postgresql_using='null') 

nullはおそらく別のものに置き換えなければならないでしょう。

また、マイグレーションが可能な限り他のDBシステムと互換性があり、私が使用するステートメント以外のシステムを使用することを余儀なくされるのであれば大丈夫でしょうか?

+0

これはおそらくCASE式が便利です。 –

答えて

0

大丈夫です。 CASEとのチップのIljaに感謝します。

は、基本的には別の方法で、すべてのこれらの値を設定しなくても、ライブマイグレーションをもたらした

'(CASE sex WHEN \'male\'... END)' 

で「ヌル」を置き換えます。私はこれが、私が持っていた移植性の要件を完全に満たすとは思っていません。なぜなら、私は依然としてpostgresのusing節を使用しているからです。それとは別に、単純なcase文が機能します。

関連する問題