Django 1.7 makemigrations不起作用 - 没有名为的列

3

我无法理解为什么我的sqlite数据库不能正常使用makemigrations命令。当我添加了一个名为userphoto的列并尝试进行迁移时,出现了错误信息"table categories_Category has no column named userphoto"。

我的python版本是3.4,django版本是1.7,只添加了userphoto这一列。

class Category(models.Model):
    username = models.CharField(max_length=15)
    realname = models.CharField(max_length=20)
    tweets = models.CharField(max_length=1000)
    tweettime = models.DateTimeField(max_length=30)
    tweetidnum = models.CharField(max_length=30)
    userphoto = models.CharField(max_length=100)

然后收到以下错误消息:

  File "/Users/xxxxxxxxx/anaconda/envs/tg/lib/python3.4/site-packages/django/db/backends/sqlite3/base.py", line 485, in execute
    return Database.Cursor.execute(self, query, params)
       django.db.utils.OperationalError: table categories_category has no column named userphoto

看起来这可能只是一个sqlite3的问题?如果我将其转移到我的Web主机服务器上,是否可以避免这种情况?

编辑:根据要求提供完整的跟踪信息

(tg)boo!:tg spencertachick$ python manage.py makemigrations
    /Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/db/models/fields/__init__.py:1282: RuntimeWarning: DateTimeField Category.tweettime received a naive datetime (2015-03-04 16:01:00) while time zone support is active.
    RuntimeWarning)

Traceback (most recent call last):
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/db/backends/sqlite3/base.py", line 485, in execute
    return Database.Cursor.execute(self, query, params)
    sqlite3.OperationalError: table categories_category has no column named userphoto

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
      File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/core/management/__init__.py", line 354, in execute
    django.setup()
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/__init__.py", line 21, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/apps/registry.py", line 108, in populate
    app_config.import_models(all_models)
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/apps/config.py", line 202, in import_models
    self.models_module = import_module(models_module_name)
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/importlib/__init__.py", line 109, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
  File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1200, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 1129, in _exec
  File "<frozen importlib._bootstrap>", line 1471, in exec_module
  File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed
  File "/Users/spencertachick/anaconda/envs/tg/tg/categories/models.py", line 54, in <module>
    tweetidnum=user_timeline[x]['id_str'])
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/db/models/manager.py", line 92, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/db/models/query.py", line 372, in create
    obj.save(force_insert=True, using=self.db)
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/db/models/base.py", line 589, in save
    force_update=force_update, update_fields=update_fields)
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/db/models/base.py", line 617, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/db/models/base.py", line 698, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/db/models/base.py", line 731, in _do_insert
    using=using, raw=raw)
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/db/models/manager.py", line 92, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/db/models/query.py", line 921, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 920, in execute_sql
    cursor.execute(sql, params)
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/db/backends/utils.py", line 81, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/utils/six.py", line 658, in reraise
    raise value.with_traceback(tb)
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/db/backends/sqlite3/base.py", line 485, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: table categories_category has no column named userphoto

在进行首次迁移之前,你是否已经同步了数据库?如果是这样,请删除userphoto字段,创建初始迁移,然后再添加它。在创建第一个迁移的时候,数据库必须与模型匹配。 - knbk
我运行了makemigrations和migrate,以确保一切正常,并收到“没有更改可应用”的消息。然后我再次尝试,但仍然出现相同的错误。我彻底删除了数据库文件并尝试进行迁移,结果收到“File”/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/db/backends/sqlite3/base.py”,第485行,在执行查询时返回Database.Cursor.execute(self, query, params)django.db.utils.OperationalError: no such table: categories_category." 因此,当我要创建新数据库时,它甚至找不到模型? - stachick
你的 categories/migrations/ 文件夹中有哪些文件?0001_initial.py 中有什么代码? - knbk
哦,又收到了一个长长的错误代码,说找不到表 File "/Users/spencertachick/anaconda/envs/tg/lib/python3.4/site-packages/django/db/backends/sqlite3/base.py", line 485, in execute return Database.Cursor.execute(self, query, params) django.db.utils.OperationalError: no such table: categories_category - stachick
你能在你的问题中发布完整的回溯吗? - knbk
显示剩余3条评论
2个回答

2

categories/models.py中的第54行:

tweetidnum=user_timeline[x]['id_str'])

显然,在导入模块时尝试创建一个Category实例并保存它。这会阻止迁移运行,因为在迁移有机会运行之前,会引发未捕获的异常。

如果您想了解确切的原因,您将需要提供更多代码,但是那一行就是罪魁祸首。我怀疑它是一个多行create语句的一部分。


非常感谢...有点尴尬。在models.py文件底部有一些代码,当我运行服务器时会更新来自Twitter API的推文。我可以将其注释掉以进行makemigrations并且效果很好。我正在让celery执行这些任务以用于生产。我很抱歉没有一开始就给你足够的代码,我不想显得很烦人并粘贴整个项目。 - stachick

2
您的迁移未正确应用。
请执行python manage.py migrate -l categories。它应该列出该应用程序中已应用的迁移。查看最后一个(或您认为必须添加user_photo的那个),并观察文件。
一旦确定要添加字段的迁移是哪个,请执行python manage.py migrate polls $prev,其中$prev是列表中的上一个迁移,并执行python manage.py migrate polls $migration,其中$migration是添加字段的迁移。
如果这样做不起作用,我建议最快的方法是使用ALTER TABLE categories ADD COLUMN "userphoto" varchar(100) NOT NULL;自行创建列,而不会丢失数据。

嘿@argaen,我收到manage.py:error:no such option:-1。另外,我不关心失去数据,有没有一种方法可以返回并实际执行我上面没有尝试过的初始迁移? - stachick
哦,我明白了,那就删除你的sqlite数据库文件。同时,删除应用程序内的迁移文件夹。然后执行 python manage.py makemigrationspython manage.py migrate 命令。如果你想添加一个超级用户,可以使用 python manage.py createsuperuser 命令。PS:选项是 -l,而不是 -1 =)。算了:刚才看到已经修复了 ^^. - argaen

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