Django(Python):DatabaseError:x表中没有名为y的列。

6

你好,我正在使用sqlite3数据库开发一个基于Django Python的应用程序。在我的models.py文件中,我定义了一个扩展Django用户模型的方法,如下所示:

#Account Model
class Account(models.Model):
  user = models.OneToOneField(User)
  avatar_url = models.CharField(max_length=200)
  profile_url = models.CharField(max_length=200)
  account_type = models.CharField(max_length=60, choices=choices.ACCOUNT_TYPE)

我还有一种创建 Account 对象 的方法,以及一个像这样定义的 post_save 处理程序:

#Function to Create user Account/Profile
def create_user_account(sender, instance, created, **kwargs):
  if created:
    models.Account.objects.create(user=instance)

#Create User / User Registration
def UserRegistration(request):
  if request.method == 'POST':
    username = request.POST['fn'].capitalize() + ' ' + request.POST['ln'].capitalize()
    # CREATE USER
    newuser = User.objects.create_user(username=username,
                                       email=request.POST['email'],
                                       password=request.POST['pw'])
    newuser.save()
  return HttpResponse(username)

#Post Save handler to create user Account/Profile
post_save.connect(create_user_account, sender=User)

现在,每当我尝试注册新用户时,都会出现以下数据库错误:
DatabaseError at /register/

table engine_account has no column named user_id

Request Method:     POST
Request URL:    http://localhost:8000/register/
Django Version:     1.4
Exception Type:     DatabaseError
Exception Value:    

table engine_account has no column named user_id

Exception Location:     /usr/local/lib/python2.7/dist-packages/Django-1.4-py2.7.egg/django/db/backends/sqlite3/base.py in execute, line 337
Python Executable:  /usr/bin/python
Python Version:     2.7.3

我不知道这个"user_id"字段是从哪里来的..有什么想法吗?

PS:

表engine_account基本上就是应用程序中名为EngineAccount类。


2
你忘记运行 syncdb 了吗? - Burhan Khalid
@BurhanKhalid 谢谢,我真是太蠢了。不过,即使我在我的账户模型中没有定义名为“username”的字段,它仍会给我一个 IntegrityError “列用户名不唯一”。 - Amyth
5个回答

10

你在运行syncdb命令后修改了models.py文件吗?

如果是这样的话,那么你应该手动编辑你的表或者使用下面的命令重新创建数据库:

python manage.py syncdb

在项目目录下应用更改。


更新2019:Django 1.9及以后版本中已弃用syncdb。请使用

python manage.py makemigrations <app_name>
python manage.py migrate --run-syncdb

2020更新:我想对我的回答增加更多描述。

如果模型和相应的表不匹配,则会出现此问题。这意味着您已经更改了模型,但没有迁移更改。有些人不理解 makemigrationsmigrate 命令之间的区别。为了让它更清楚,我将尝试解释一下两者的区别:

./manage.py makemigrations <app_name>:将给定应用程序的模型更改与以前的迁移进行比较。如果未提供 app_name,则将控制所有跟踪的应用程序,并且如果有任何更改,则会创建迁移。每个应用程序都有自己的迁移目录,此命令将在此目录中创建相关的迁移。当创建迁移时,数据库上没有任何更改,需要应用迁移。如果您不应用迁移,则仍将收到相同的错误。

./manage.py migrate:应用由 makemigrations 命令创建的迁移到数据库。 在生产环境中迁移时需要谨慎。

./manage.py showmigrations:此命令列出迁移的状态,您可以查看迁移是否已应用。通常状态存储在数据库中,但无需连接到数据库并爬行数据。此命令为您提供了清晰的输入。


9

syncdb在Django 1.9及以上版本中已被弃用。因此,在Django版本1.9或更高版本中,运行python manage.py makemigrations <app-name>,然后运行python manage.py migrate


5

我尝试了 python manage.py syncdb,但这并不够,所以解决方法是:

我删除了 migrations文件db.sqlite3文件,

我执行了 python manage.py makemigrations 以及 python manage.py migrate

完成!


0
对于像我一样在测试过程中遇到这个问题的人——在我的调试器配置文件中,我将--keepdb选项传递给了Django的测试命令;在我对模型进行更改并通过迁移同步之前,我有一个测试数据库挂在那里。销毁旧的测试数据库解决了我的问题。

0
一个解决方案(请注意,您的数据将被删除):
  1. 使用以下命令删除迁移:find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
  2. 在Visual Studio中删除数据库文件
  3. 运行:python3 manage.py makemigrations
  4. 运行:python3 manage.py migrate(只有这个)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接