4

Django プロジェクトの 1 つで South を使用して移行しようとするたびに、このエラーを回避するために何をすべきかわかりません。

エラー:

askbot の移行の実行:

  • 転送を 0006_auto__del_field_tagplus_tag_ptr__add_field_tagplus_id__add_field_tagpl に移行しています。

askbot:0006_auto__del_field_tagplus_tag_ptr__add_field_tagplus_id__add_field_tagpl

致命的なエラー - 次の SQL クエリが失敗しました: ALTER TABLE "tagplus" ADD COLUMN "id" serial NOT >NULL PRIMARY KEY DEFAULT -1; エラー: テーブル「tagplus」のカラム「id」に複数のデフォルト値が指定されました

移行エラー: >askbot:0006_auto__del_field_tagplus_tag_ptr__add_field_tagplus_id__add_field_tagpl DatabaseError: テーブル「tagplus」の列「id」に複数のデフォルト値が指定されました

移行ファイル 0006 コード (部分):

class Migration(SchemaMigration):

def forwards(self, orm):
    # Deleting field 'TagPlus.tag_ptr'
    db.delete_column(u'tagplus', u'tag_ptr_id')

    # Adding field 'TagPlus.id'
    db.add_column(u'tagplus', u'id',
                  self.gf('django.db.models.fields.AutoField')(default=0, primary_key=True),
                  keep_default=False)

    # Adding field 'TagPlus.name'
    db.add_column(u'tagplus', 'name',
                  self.gf('django.db.models.fields.CharField')(default=0, unique=True, max_length=255),
                  keep_default=False)

   

ありがとう!

編集:

エラーは、移行ファイルの作成中にプロンプ​​トが表示されたこの選択に関係していると思います。

 ? The field 'TagPlus.tag_ptr' does not have a default specified, yet is NOT NULL.
 ? Since you are removing this field, you MUST specify a default
 ? value to use for existing rows. Would you like to:
 ?  1. Quit now.
 ?  2. Specify a one-off value to use for existing columns now
 ?  3. Disable the backwards migration by raising an exception; you can edit the migration to fix it later
 ? Please select a choice: 

「1 回限りの値を指定する」を選択し、この値を0

4

2 に答える 2

5

あなたはとにかく言ってkeep_default=Falseいます。だからdefault=0あなたのコードからそれを削除してください

   db.add_column(u'tagplus', u'id',
                  self.gf('django.db.models.fields.AutoField')(primary_key=True),
                  keep_default=False)

NOT NULLSQLごとに(を削除)する必要があります

ALTER TABLE tagplus ADD COLUMN id serial PRIMARY KEY

このエラーの背後にある理由を説明するこのドキュメントを参照してください http://www.postgresql.org/docs/8.3/interactive/datatype-numeric.html#DATATYPE-SERIAL

于 2014-05-07T20:37:28.350 に答える
2

注意すべき点が 2 つあります。

  1. 以前に手動で設定したことがない場合、Django は「id」をデフォルトの主キーとして使用します。こちらを参照してください。

  2. Postgres には、実際には「シリアル」タイプはありません。この問題を解決するには、以下を置き換えてみてください。

    # Adding field 'TagPlus.id'
    db.add_column(u'tagplus', u'id', self.gf('django.db.models.fields.AutoField')(default=0, primary_key=True), keep_default=False)
    

と:

    # Adding field 'TagPlus.id'
    if 'postgres' in db.backend_name.lower():
        db.execute("CREATE SEQUENCE tagplus_id_seq")
        db.execute("SELECT setval('tagplus_id_seq', (SELECT MAX(id) FROM tagplus))")
        db.execute("ALTER TABLE tagplus ADD COLUMN id SET DEFAULT nextval('tagplus_id_seq'::regclass)")
        db.execute("ALTER SEQUENCE tagplus_id_seq OWNED BY tagplus.id")
    else:
        db.add_column(u'tagplus', u'id', self.gf('django.db.models.fields.AutoField')(default=0, primary_key=True), keep_default=False)
于 2014-05-25T16:05:31.040 に答える