postgresql django.db.utils.IntegrityError:“venue_city”列包含空值

50few1ms  于 11个月前  发布在  PostgreSQL
关注(0)|答案(8)|浏览(118)

我在stackoverflow和google上读了很多其他的帖子,但是我找不到解决方案。
这一切都始于我将模型从CharField更改为ForeignKey。我收到的错误是:

Operations to perform:
  Synchronize unmigrated apps: gis, staticfiles, crispy_forms, geoposition, messages
  Apply all migrations: venues, images, amenities, cities_light, registration, auth, admin, sites, sessions, contenttypes, easy_thumbnails, newsletter
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  Rendering model states... DONE
  Applying venues.0016_auto_20160514_2141...Traceback (most recent call last):
  File "/Users/iam-tony/.envs/venuepark/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
psycopg2.IntegrityError: column "venue_city" contains null values

字符串
我的模型如下:

class Venue(models.Model):
    venue_city = models.ForeignKey(City, null=True,)
    venue_country=models.ForeignKey(Country, null=True)


venue_country之前不存在,因此迁移成功。但venue_city是CharField。
我对我的迁移文件做了一些修改,以便它可以执行SQL,如下所示:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models

class Migration(migrations.Migration):

    dependencies = [
        ('venues', '0011_venue_map_activation'),
    ]

    migrations.RunSQL(''' ALTER TABLE venues_venue ALTER venue_city TYPE integer USING  venue_city::integer '''),

    migrations.RunSQL(''' ALTER TABLE venues_venue ALTER venue_city RENAME COLUMN venue_city TO venue_city_id '''),

    migrations.RunSQL(''' ALTER TABLE venues_venue ADD CONSTRAINT venues_venus_somefk FOREIGN KEY (venue_city_id) REFERENCES  cities_light (id) DEFERRABLE INITIALLY DEFERRED'''),


先谢谢你了!
更新:我的新迁移文件:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models

class Migration(migrations.Migration):

    dependencies = [
        ('cities_light', '0006_compensate_for_0003_bytestring_bug'),
        ('venues', '0024_remove_venue_venue_city'),
    ]

    operations = [
        migrations.AddField(
            model_name='venue',
            name='venue_city',
            field=models.ForeignKey(null=True, to='cities_light.City'),
        ),
    ]

rsl1atfo

rsl1atfo1#

看起来您在创建迁移文件后添加了null=True。因为venue_city在您的迁移文件中不是可空字段
请遵循下列步骤。

1) Drop venue_city & venue_country from your local table
3) Delete all the migration files you created for these `CharField to a ForeignKey` change
4) execute `python manage.py makemigrations`
5) execute 'python manage.py migrate'

字符串
它应该工作

brjng4g3

brjng4g32#

有一个类似的问题,我解决了它删除以前的迁移文件。没有技术解释

tez616oj

tez616oj3#

我只是将null = True添加到导致问题的(自动生成的)迁移文件和模型中,就解决了这个问题。然后再次添加migrate,失败的迁移现在就成功了。因为您也在模型中更改了它,所以makemigration在此之后不会检测到任何更改。

xn1cxnb4

xn1cxnb44#

按以下步骤操作:

  • 在Venue模型类中添加 null=True,blank=True 例如:venue_city = models.ForeignKey(City,null=True,blank=True)
  • 从应用程序的migrations文件夹中删除 venues.0016_auto_20160514_2141 迁移文件
  • 然后运行 python manage.py makemigrations
  • 然后运行 python manage.py migrate

无需删除表或从迁移表中删除迁移

e7arh2l6

e7arh2l65#

我在下面解决了它:
1.首先删除最后迁移面临的问题
1.然后添加venue_city = models.CharField(blank=True, null=True)
1.最后使用makemigrationsmigrate命令

r55awzrz

r55awzrz6#

正如错误所说,在“venue_city”列中有一个空值。
在定义模型时,似乎没有包含“null=True”。
所以它返回null,因为'venue_city'变量中没有任何内容。考虑删除最后一个迁移文件,然后使用python manage.py makemigrationspython manage.py migrate命令执行另一个迁移。

rpppsulh

rpppsulh7#

已创建迁移,但在运行过程中失败。请删除最后一个迁移。
修改模型定义,如果你想让它在数据库中允许null,可以添加null=True,default=None。当你在现有表中添加列时,你需要提供任何默认值。
再次重新生成迁移(manage.py makemigrations venues)并迁移(manage.py migrate venues)。

iugsix8n

iugsix8n8#

您可能需要打开迁移0016_auto_20160514_2141并在其中分配一些默认值。

相关问题