12

Southを使用してデータベースを移行するOSプロジェクトで作業しています。新しいデータベースを最初から構築しています。将来データベースを簡単に更新できるように、Southがセットアップされていることを確認したいと思います。

このプロセスは次のようになります。

  1. dbを作成します
  2. syncdb
  3. 移行する

ただし、データベースを移行しようとすると、以前の移行の1つ(移行0004およびそれらは0009に移動)は例外をスローします。

ValueError: You cannot add a null=False column without a default value.

移行0004にデフォルト値を追加する方法がわからないため、この例外はスローされません。

データベースが空であるため、移行を実行する必要はありません。

ただし、 south_migrationhistoryには、すべての移行とそれらがいつ適用されたかのリストが含まれている必要があります。

私はそれをハックしてデータベースに移行0009を手動で追加しようとしましたが、中間の移行が実行されていなかったため、これは別のエラーをスローしました。また、データベースにフィールドを追加して、デフォルト値0が指定された場合のadd_columnの構文がどのようになるかを理解できるかどうかを確認しました。形式は、これらの古い移行とはまったく異なります。

add_column構文の2つの異なるバージョンを次に示します。

#0004 syntax:  
db.add_column('experiments_dailyreport', 'test_group_size', orm['experiments.dailyreport:test_group_size'])
#0009 syntax:
syntax db.add_column('experiments_dailyreport', 'test_group_size', self.gf('django.db.models.fields.IntegerField')(default=0), keep_default=False)

ですから、0004が作成されてから今日までの間に南のコードに変更があったと思います。

syncdbを使用してデータベースを構築し、manage.pymigrateを実行せずにsouth_migrationhistoryを更新する方法はありますか?

南に移行する既存のアプリがある場合、新しいデータベースを最初からどのように構築しますか?

整数フィールドにデフォルトが設定されていないため、移行できません。古い移行でデフォルトを設定するにはどうすればよいですか?フィールドはもう存在しません。

試行された構文:

db.add_column('experiments_dailyreport', 'test_group_size', orm['experiments.dailyreport:test_group_size'], {'default': 0})
#throws ValueError: You cannot add a null=False column without a default value.
db.add_column('experiments_dailyreport', 'test_group_size', self.gf('django.db.models.fields.IntegerField')(default=0), keep_default=False)
#throws AttributeError: Migration instance has no attribute 'gf'

私はSouth-0.7.2-py2.7.eggを使用しています

4

2 に答える 2

15

アンドリュー・ゴドウィンは答えを提供しました:

はい、次を使用します。

./manage.py syncdb --all  

それから:

./manage.py migrate --fake  

ただし、これはデータベースにデータを追加する移行も無視します。

于 2010-11-12T15:06:34.780 に答える