从 Django 1.6 升级到 1.9:python manage.py 迁移失败
Upgrading from Django 1.6 to 1.9: python manage.py migrate failure
我正在 运行生产环境中使用 Django 1.6.6,并且最近在暂存(开发服务器)上升级到 1.9.7。此更新是在服务器上执行的,我按照此处列出的步骤进行操作 Upgrading from South。
我注意到迁移文件的结构发生了变化,它们不再包含 create
语句。这会导致问题,因为如果我从我的 GitHub 存储库和 运行 python manage.py makemigrations
或 python manage.py migrate
中提取这个新代码,它会说:
django.db.utils.OperationalError: no such table: appname_modelname
回溯指向我的 urls.py 因为我在查询集中引用模型:
queryset=list(chain(models.modelname.objects.filter(booleanField=True).order_by(object), models.aDifferentModel.objects.all())),
在 1.9 升级之前,syncdb
为我创建了 table,但 migrate
并非如此。我也试过 python manage.py migrate --run-syncdb
但这给出了同样的错误。
但是,如果我将 SQLite 数据库从我的生产或暂存环境复制到我的本地计算机并使用 运行 命令,它会起作用(因为 table 已经在数据库中)。
我必须手动创建这些 table 吗(虽然我假设不是)还是我做错了什么?
编辑:添加了代码片段和回溯。很抱歉最初没有这样做。
models.py
class HowToApply(models.Model):
title = models.CharField(max_length=500, blank=True, null=True)
notice = models.TextField(blank=True, null=True)
description = models.TextField(blank=True, null=True)
active = models.BooleanField(default=None)
image = models.FileField(upload_to='numeric/img/%Y', blank=True, null=True)
mobile_image = models.FileField(upload_to='mobile/img/%Y', blank=True, null=True)
sequence_number = models.IntegerField(unique=True)
...
urls.py
from django.conf.urls import patterns, include, url
from django.views.generic import RedirectView, TemplateView, ListView, CreateView
from numeric import models, forms, views
from honeypot.decorators import check_honeypot
from numeric.views import CheckDeviceView
from itertools import chain
urlpatterns = patterns('',
url(r'^academy/howtoapply/$',
ListView.as_view(
queryset = list(chain(models.HowToApply.objects.filter(active=True).order_by('sequence_number'), models.AcademyAdmin.objects.all())),
template_name = 'numeric/apply.html'
),
name='apply'),
...
回溯
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 350, in execute_from_command_line
utility.execute()
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 342, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/management/base.py", line 348, in run_from_argv
self.execute(*args, **cmd_options)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/management/base.py", line 398, in execute
self.check()
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/management/base.py", line 426, in check
include_deployment_checks=include_deployment_checks,
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/checks/registry.py", line 75, in run_checks
new_errors = check(app_configs=app_configs)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/checks/urls.py", line 10, in check_url_config
return check_resolver(resolver)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/checks/urls.py", line 19, in check_resolver
for pattern in resolver.url_patterns:
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/utils/functional.py", line 33, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 417, in url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/utils/functional.py", line 33, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 410, in urlconf_module
return import_module(self.urlconf_name)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/var/www/website_mig/project/urls.py", line 14, in <module>
(r'^', include('numeric.urls')),
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/conf/urls/__init__.py", line 52, in include
urlconf_module = import_module(urlconf_module)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/var/www/website_mig/numeric/urls.py", line 144, in <module>
queryset = list(chain(models.HowToApply.objects.filter(active=True).order_by('sequence_number'), models.AcademyAdmin.objects.all())),
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/models/query.py", line 258, in __iter__
self._fetch_all()
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/models/query.py", line 1074, in _fetch_all
self._result_cache = list(self.iterator())
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/models/query.py", line 52, in __iter__
results = compiler.execute_sql()
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 852, in execute_sql
cursor.execute(sql, params)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/utils.py", line 95, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 323, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such table: numeric_howtoapply`
问题是 urls.py
加载时正在评估您的查询集。当您 运行 makemigrations
用于新项目时,这会导致错误,因为 table 尚未创建。
您可以通过子类化 ListView
并将查询集移动到 get_queryset
.
来解决这个问题
class MyListView(ListView):
template_name = 'numeric/apply.html'
def get_queryset(self):
return list(chain(models.HowToApply.objects.filter(active=True).order_by('sequence_number'), models.AcademyAdmin.objects.all()))
然后更改您的 url 模式以使用您的新视图。
url(r'^academy/howtoapply/$',
MyListView.as_view(),
name='apply',
),
Django 1.9 运行s 一些检查以验证您的 url 模式,这意味着 url 模式在 makemigrations
命令之前加载 运行秒。 Django 1.8 没有这些检查,所以你可以像你所做的那样设置查询集。
我正在 运行生产环境中使用 Django 1.6.6,并且最近在暂存(开发服务器)上升级到 1.9.7。此更新是在服务器上执行的,我按照此处列出的步骤进行操作 Upgrading from South。
我注意到迁移文件的结构发生了变化,它们不再包含 create
语句。这会导致问题,因为如果我从我的 GitHub 存储库和 运行 python manage.py makemigrations
或 python manage.py migrate
中提取这个新代码,它会说:
django.db.utils.OperationalError: no such table: appname_modelname
回溯指向我的 urls.py 因为我在查询集中引用模型:
queryset=list(chain(models.modelname.objects.filter(booleanField=True).order_by(object), models.aDifferentModel.objects.all())),
在 1.9 升级之前,syncdb
为我创建了 table,但 migrate
并非如此。我也试过 python manage.py migrate --run-syncdb
但这给出了同样的错误。
但是,如果我将 SQLite 数据库从我的生产或暂存环境复制到我的本地计算机并使用 运行 命令,它会起作用(因为 table 已经在数据库中)。
我必须手动创建这些 table 吗(虽然我假设不是)还是我做错了什么?
编辑:添加了代码片段和回溯。很抱歉最初没有这样做。
models.py
class HowToApply(models.Model):
title = models.CharField(max_length=500, blank=True, null=True)
notice = models.TextField(blank=True, null=True)
description = models.TextField(blank=True, null=True)
active = models.BooleanField(default=None)
image = models.FileField(upload_to='numeric/img/%Y', blank=True, null=True)
mobile_image = models.FileField(upload_to='mobile/img/%Y', blank=True, null=True)
sequence_number = models.IntegerField(unique=True)
...
urls.py
from django.conf.urls import patterns, include, url
from django.views.generic import RedirectView, TemplateView, ListView, CreateView
from numeric import models, forms, views
from honeypot.decorators import check_honeypot
from numeric.views import CheckDeviceView
from itertools import chain
urlpatterns = patterns('',
url(r'^academy/howtoapply/$',
ListView.as_view(
queryset = list(chain(models.HowToApply.objects.filter(active=True).order_by('sequence_number'), models.AcademyAdmin.objects.all())),
template_name = 'numeric/apply.html'
),
name='apply'),
...
回溯
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 350, in execute_from_command_line
utility.execute()
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 342, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/management/base.py", line 348, in run_from_argv
self.execute(*args, **cmd_options)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/management/base.py", line 398, in execute
self.check()
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/management/base.py", line 426, in check
include_deployment_checks=include_deployment_checks,
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/checks/registry.py", line 75, in run_checks
new_errors = check(app_configs=app_configs)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/checks/urls.py", line 10, in check_url_config
return check_resolver(resolver)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/checks/urls.py", line 19, in check_resolver
for pattern in resolver.url_patterns:
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/utils/functional.py", line 33, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 417, in url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/utils/functional.py", line 33, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 410, in urlconf_module
return import_module(self.urlconf_name)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/var/www/website_mig/project/urls.py", line 14, in <module>
(r'^', include('numeric.urls')),
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/conf/urls/__init__.py", line 52, in include
urlconf_module = import_module(urlconf_module)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/var/www/website_mig/numeric/urls.py", line 144, in <module>
queryset = list(chain(models.HowToApply.objects.filter(active=True).order_by('sequence_number'), models.AcademyAdmin.objects.all())),
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/models/query.py", line 258, in __iter__
self._fetch_all()
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/models/query.py", line 1074, in _fetch_all
self._result_cache = list(self.iterator())
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/models/query.py", line 52, in __iter__
results = compiler.execute_sql()
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 852, in execute_sql
cursor.execute(sql, params)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/utils.py", line 95, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 323, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such table: numeric_howtoapply`
问题是 urls.py
加载时正在评估您的查询集。当您 运行 makemigrations
用于新项目时,这会导致错误,因为 table 尚未创建。
您可以通过子类化 ListView
并将查询集移动到 get_queryset
.
class MyListView(ListView):
template_name = 'numeric/apply.html'
def get_queryset(self):
return list(chain(models.HowToApply.objects.filter(active=True).order_by('sequence_number'), models.AcademyAdmin.objects.all()))
然后更改您的 url 模式以使用您的新视图。
url(r'^academy/howtoapply/$',
MyListView.as_view(),
name='apply',
),
Django 1.9 运行s 一些检查以验证您的 url 模式,这意味着 url 模式在 makemigrations
命令之前加载 运行秒。 Django 1.8 没有这些检查,所以你可以像你所做的那样设置查询集。