4

モデルの2つのフィールドを編集し、それらをIntegerFieldsからsに変更しましたTimeField

class Model(models.Model):
    start_time = models.TimeField()
    end_time = models.TimeField()

私はこれらの2つのフィールドを使用して、時間の地理的概念とは関係がないため、実際の「タイムゾーン」(レース時間に似たものを考えてください)を持たない素朴な時間を節約しています。私のローカルデータベースはPostgreSQLです。

ただし、この変更から生成された南への移行は、次のエラーで失敗します。

> main:0005_auto__chg_field_model_start_time__chg_field_model_end_time
FATAL ERROR - The following SQL query failed: ALTER TABLE "main_model" ALTER COLUMN "start_time" TYPE time, ALTER COLUMN "start_time" SET NOT NULL, ALTER COLUMN "start_time" DROP DEFAULT;

...

File ".../lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 52, in execute
    return self.cursor.execute(query, args)
django.db.utils.DatabaseError: column "start_time" cannot be cast to type time without time zone

失敗した移行には次のようなものがあります。

class Migration(SchemaMigration):

    def forwards(self, orm):

        # Changing field 'Model.start_time'
        db.alter_column('main_model', 'start_time', self.gf('django.db.models.fields.TimeField')())

        # Changing field 'Model.end_time'
        db.alter_column('main_model', 'end_time', self.gf('django.db.models.fields.TimeField')())

この移行についてpostgresを幸せにする方法について何かアイデアはありますか?

PS私は開発中なので、データの移行についてはまったく気にしません。DBが空であると想定することができます。

4

3 に答える 3

5

データは気にしないので、最も簡単な方法は、列を削除してから、タイプを付けて再度追加することTimeです。

これを行うには、現在の移行を手動で編集します。または、この移行を削除してから、フィールドにコメントを付けて実行schemamigration --autoし、フィールドを追加して再度実行します。

于 2012-06-06T21:47:50.333 に答える
0

移行スクリプトを手動で編集して(@Macceschに感謝)、すべての呼び出しが。に続くalter_column()ように置き換えられました。delete_column()add_column()

これは、データ移行が行われず、この移行前に存在していたデータがすべて削除されることを意味することに注意してください。

コード:

def forwards(self, orm):

    # NOTE: NO MIGRATION HERE!!
    # THIS _WILL_ CAUSE DATA LOSS

    # Changing field 'Model.start_time'
    db.delete_column('main_model', 'start_time')
    db.add_column('main_model', 'start_time', self.gf('django.db.models.fields.TimeField')())

    # Changing field 'Model.end_time'
    db.delete_column('main_model', 'end_time')
    db.add_column('main_model', 'end_time', self.gf('django.db.models.fields.TimeField')())

backwards()同様に実装されます。

于 2012-06-07T10:43:12.930 に答える
-1

私もこの問題に遭遇しました。問題は、新しいテストデータベースを作成するときのサウスの移行にありました。配置

SOUTH_TESTS_MIGRATE = False

設定ファイルに追加すると、問題が修正されました。

于 2013-12-17T12:09:43.227 に答える