运行Django填充脚本时出错 - Tango与Django
我正在把一个在线教程(Tango with Django)应用部署到python anywhere上,但在运行populate_rango脚本时遇到了问题。我总是收到“列名不唯一”的错误提示,并且有一大堆错误信息。 有没有人知道这是什么问题?需要帮助。这应该是个简单的修复。 我注意到其他人也遇到了同样的问题,但没有人回答。
populate_rango.py
import os
def populate():
python_cat = add_cat(name='Python', views=128, likes=64)
add_page(cat=python_cat,
title="Official Python Tutorial",
views=25,
url="http://docs.python.org/2/tutorial/")
add_page(cat=python_cat,
title="How to Think like a Computer Scientist",
views=20,
url="http://www.greenteapress.com/thinkpython/")
add_page(cat=python_cat,
title="Learn Python in 10 minutes",
views=12,
url="http://www.korokithakis.net/tutorials/python/")
django_cat = add_cat(name="Django", views=32, likes=16)
add_page(cat=django_cat,
title="Official Django Tutorial",
views=55,
url="http://djangoproject.com/en/1.5/intro/tutorial01/")
add_page(cat=django_cat,
title="Django Rocks",
views=34,
url="http://www.djangorocks.com/")
add_page(cat=django_cat,
title="How to Tango with Django",
views=49,
url="htttp://www.tangowithdjango.com/")
frame_cat = add_cat(name="Other Frameworks", views=32, likes=16)
add_page(cat=frame_cat,
title="Bottle",
views=78,
url="http://bottlepy.org/docs/dev/")
add_page(cat=frame_cat,
title="Flask",
views=29,
url="http://flask.pocoo.org")
# Print out what we have added to the user.
for c in Category.objects.all():
for p in Page.objects.filter(category=c):
print "- {0} - {1}".format(str(c), str(p))
def add_page(cat, title, url, views=0):
p = Page.objects.get_or_create(category=cat, title=title, url=url, views=views)[0]
return p
def add_cat(name, views, likes):
c = Category.objects.get_or_create(name=name, views=views, likes=likes)[0]
return c
if __name__ == '__main__':
print "Staring Rango population script..."
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tango_with_django.settings')
from rango.models import Category, Page
populate()
Staring Rango population script...
Traceback (most recent call last):
File "populate_rango.py", line 67, in <module>
populate()
File "populate_rango.py", line 4, in populate
python_cat = add_cat(name='Python', views=128, likes=64)
File "populate_rango.py", line 60, in add_cat
c = Category.objects.get_or_create(name=name, views=views, likes=likes)[0]
File "/home/timkaboya/.virtualenvs/rango/local/lib/python2.7/site-packages/django/db/models/manager.py", line 154, in get_or_create
return self.get_queryset().get_or_create(**kwargs)
File "/home/timkaboya/.virtualenvs/rango/local/lib/python2.7/site-packages/django/db/models/query.py", line 391, in get_or_create
six.reraise(*exc_info)
File "/home/timkaboya/.virtualenvs/rango/local/lib/python2.7/site-packages/django/db/models/query.py", line 383, in get_or_create
obj.save(force_insert=True, using=self.db)
File "/home/timkaboya/.virtualenvs/rango/local/lib/python2.7/site-packages/django/db/models/base.py", line 545, in save
force_update=force_update, update_fields=update_fields)
File "/home/timkaboya/.virtualenvs/rango/local/lib/python2.7/site-packages/django/db/models/base.py", line 573, in save_base
updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "/home/timkaboya/.virtualenvs/rango/local/lib/python2.7/site-packages/django/db/models/base.py", line 654, in _save_table
result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
File "/home/timkaboya/.virtualenvs/rango/local/lib/python2.7/site-packages/django/db/models/base.py", line 687, in _do_insert
using=using, raw=raw)
File "/home/timkaboya/.virtualenvs/rango/local/lib/python2.7/site-packages/django/db/models/manager.py", line 232, in _insert
return insert_query(self.model, objs, fields, **kwargs)
File "/home/timkaboya/.virtualenvs/rango/local/lib/python2.7/site-packages/django/db/models/query.py", line 1514, in insert_query
return query.get_compiler(using=using).execute_sql(return_id)
File "/home/timkaboya/.virtualenvs/rango/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 903, in execute_sql
cursor.execute(sql, params)
File "/home/timkaboya/.virtualenvs/rango/local/lib/python2.7/site-packages/django/db/backends/util.py", line 69, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File "/home/timkaboya/.virtualenvs/rango/local/lib/python2.7/site-packages/django/db/backends/util.py", line 53, in execute
return self.cursor.execute(sql, params)
File "/home/timkaboya/.virtualenvs/rango/local/lib/python2.7/site-packages/django/db/utils.py", line 99, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/home/timkaboya/.virtualenvs/rango/local/lib/python2.7/site-packages/django/db/backends/util.py", line 53, in execute
return self.cursor.execute(sql, params)
File "/home/timkaboya/.virtualenvs/rango/local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 451, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: column name is not unique
3 个回答
1
我之前也遇到过同样的问题,这里分享一下我的解决办法:主要问题出在这行代码上 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tango_with_django_project.settings')
,我的项目文件夹其实叫 tango_with_django
。具体这行代码的意思我也不太清楚,但我把这些代码放在了导入 os
之后(记得把底下的 os.environ.
去掉)
所以代码看起来是这样的:
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tango_with_django.settings')
import django
django.setup()
from rango.models import Category, Page
1
根据我记得的,我也遇到过同样的问题。我找到了我以前的项目,下面是相关的代码:
import os
def populate():
python_cat = add_cat('Python')
add_page(cat=python_cat,
title="Official Python Tutorial",
url="http://docs.python.org/2/tutorial/")
add_page(cat=python_cat,
title="How to Think like a Computer Scientist",
url="http://www.greenteapress.com/thinkpython/")
add_page(cat=python_cat,
title="Learn Python in 10 Minutes",
url="http://www.korokithakis.net/tutorials/python/")
django_cat = add_cat("Django")
add_page(cat=django_cat,
title="Official Django Tutorial",
url="https://docs.djangoproject.com/en/1.5/intro/tutorial01/")
add_page(cat=django_cat,
title="Django Rocks",
url="http://www.djangorocks.com/")
add_page(cat=django_cat,
title="How to Tango with Django",
url="http://www.tangowithdjango.com/")
frame_cat = add_cat("Other Frameworks")
add_page(cat=frame_cat,
title="Bottle",
url="http://bottlepy.org/docs/dev/")
add_page(cat=frame_cat,
title="Flask",
url="http://flask.pocoo.org")
# Print out what we have added to the user.
for c in Category.objects.all():
for p in Page.objects.filter(category=c):
print "- {0} - {1}".format(str(c), str(p))
def add_page(cat, title, url, views=0):
p = Page.objects.get_or_create(category=cat, title=title, url=url, views=views)[0]
return p
def add_cat(name):
c = Category.objects.create(name=name)
return c
# Start execution here!
if __name__ == '__main__':
print "Starting Rango population script..."
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tango_with_django.settings')
from rango.models import Category, Page
populate()
1
我通过交互式控制台(python manage.py shell)模拟了这个问题:
>>> from rango.models import Category
>>> print Category.objects.all()
[]
>>> c = Category(name="Test") # Add new category named Test
>>> c.save()
>>> print Category.objects.all()
[<Category: Test>]
>>> c = Category(name="Test", view="1", like="1") # Try adding another record named Test with view and like values
>>> c.save()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Library/Python/2.7/site-packages/django/db/models/base.py", line 546, in save
force_update=force_update, update_fields=update_fields)
File "/Library/Python/2.7/site-packages/django/db/models/base.py", line 650, in save_base
result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw)
File "/Library/Python/2.7/site-packages/django/db/models/manager.py", line 215, in _insert
return insert_query(self.model, objs, fields, **kwargs)
File "/Library/Python/2.7/site-packages/django/db/models/query.py", line 1675, in insert_query
return query.get_compiler(using=using).execute_sql(return_id)
File "/Library/Python/2.7/site-packages/django/db/models/sql/compiler.py", line 937, in execute_sql
cursor.execute(sql, params)
File "/Library/Python/2.7/site-packages/django/db/backends/util.py", line 41, in execute
return self.cursor.execute(sql, params)
File "/Library/Python/2.7/site-packages/django/db/backends/sqlite3/base.py", line 364, in execute
six.reraise(utils.IntegrityError, utils.IntegrityError(*tuple(e.args)), sys.exc_info()[2])
File "/Library/Python/2.7/site-packages/django/db/backends/sqlite3/base.py", line 362, in execute
return Database.Cursor.execute(self, query, params)
IntegrityError: column name is not unique
>>> c = Category(name="Test2", view="1", like="1") # --- This one worked because I'm adding a unique name ---
>>> c.save()
>>> print Category.objects.all()
[<Category: Test>, <Category: Test2>]
因为在Category模型中,name这个属性是唯一的:
name = models.CharField(max_length=128, unique=True)
简单来说,我试图在name这一列添加“Test”,但这个值已经存在了。
更新:
确认解决方案:
- 删除rango.db数据库
- 运行“python manage.py syncdb”来重新创建数据库
- 运行“python populate_rango.py”。
所以这个错误确实是因为数据库中有重复的名称值。
祝你好运!