【问题标题】:makemigrations failing after moving from Windows to Linux with Postgres使用 Postgres 从 Windows 迁移到 Linux 后,makemigrations 失败
【发布时间】:2018-02-05 15:45:15
【问题描述】:

我有一个在 Django Windows 环境中开发的小型 Web 应用程序(使用 Postgres),它运行良好。我现在正试图将其移至 Redhat 6.8,但 makemigrations 失败了。
我已经安装了 Postgres 并在 Linux 上创建了数据库。我创建了新数据库,因为我不需要 Windows 上的任何旧测试数据。我移动了所有文件(.pyc 文件除外)。下面是我得到的错误。它似乎正在尝试访问尚未创建的表。 (它还没有创建,因为我还不能运行迁移(有点像鸡/蛋范式)。注意,从我读过的内容来看,我还删除了除了 init.py。我已经为此苦苦挣扎了好几个小时。任何帮助将不胜感激。 谢谢。

    webtest2) [asilver@SDNAUTOS02 sdnlabs2]$ python manage.py makemigrations
Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/core/management/
    utility.execute()
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/core/management/
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/core/management/
    self.execute(*args, **cmd_options)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/core/management/
    self.check()
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/core/management/
    include_deployment_checks=include_deployment_checks,
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/core/management/
    return checks.run_checks(**kwargs)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/core/checks/regi
    new_errors = check(app_configs=app_configs)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/core/checks/urls
    return check_resolver(resolver)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/core/checks/urls
    return check_method()
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/urls/resolvers.p
    for pattern in self.url_patterns:
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/utils/functional
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/urls/resolvers.p
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/utils/functional
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/urls/resolvers.p
    return import_module(self.urlconf_name)
  File "/usr/local/python2.7.14/lib/python2.7/importlib/__init__.py", line 37, in import_modul
    __import__(name)
  File "/home/asilver/pythonProjects/django/sdntest2/sdnweb/sdnlabs2/sdnlabs2/urls.py", line 24
    url(r'^inventory/', include('inventory.urls')),
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/conf/urls/__init
    urlconf_module = import_module(urlconf_module)
  File "/usr/local/python2.7.14/lib/python2.7/importlib/__init__.py", line 37, in import_modul
    __import__(name)
  File "/home/asilver/pythonProjects/django/sdntest2/sdnweb/sdnlabs2/inventory/urls.py", line 3
    from . import views
  File "/home/asilver/pythonProjects/django/sdntest2/sdnweb/sdnlabs2/inventory/views.py", line
    from .filters import *
  File "/home/asilver/pythonProjects/django/sdntest2/sdnweb/sdnlabs2/inventory/filters.py", lin
    class PerfvRtrOnlyFilter(django_filters.FilterSet):
  File "/home/asilver/pythonProjects/django/sdntest2/sdnweb/sdnlabs2/inventory/filters.py", lin
    choiceList = get_unique_choice_list(partial_query_set)
  File "/home/asilver/pythonProjects/django/sdntest2/sdnweb/sdnlabs2/inventory/lib.py", line 20
    y = set(querySet)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/db/models/query.
    self._fetch_all()
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/db/models/query.
    self._result_cache = list(self._iterable_class(self))
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/db/models/query.
    for row in compiler.results_iter(chunked_fetch=self.chunked_fetch):
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/db/models/sql/co
    results = self.execute_sql(MULTI, chunked_fetch=chunked_fetch)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/db/models/sql/co
    raise original_exception
django.db.utils.ProgrammingError: relation "inventory_perfvrtronly" does not exist
LINE 1: SELECT "inventory_perfvrtronly"."topoName" FROM "inventory_p...
                                                        ^

(webtest2) [asilver@SDNAUTOS02 sdnlabs2]$

【问题讨论】:

  • 如果您对迁移有疑问,您可以随时尝试删除本地环境中的所有migrations 目录,然后执行python manage.py migrate 它将重新创建正确的迁移脚本。但这意味着您不能使用以前的转储,因为它会记住旧的迁移脚本。

标签: django postgresql


【解决方案1】:

您的 PerfvRtrOnlyFilter 类正在尝试在类级别执行查询,这意味着即使第一次导入该类,它也会运行。这是在任何迁移运行之前。

您总是在方法或函数中进行任何数据库访问。

【讨论】:

  • 嗯。我在这里使用 django_filters 并且我相信我正在实现这个类似于文档中的示例。如果您认为这会有所帮助,我可以发布整个类定义的代码。在该类定义中,我引用了我编写的一个名为“get_unique_choice”的函数。该函数位于 lib.py 文件中。你是说我不应该这样做吗?谢谢。
  • 是的,您应该发布代码。您当然不应该在类级别调用该函数
【解决方案2】:

我收到的两个建议似乎非常相似,所以我尝试了列出说明的那个。我无法通过上面的第二步。我注销了该应用程序,然后尝试运行 migrate 但这次得到了不同的错误。有什么建议吗?

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line
    utility.execute()
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/core/management/__init__.py", line 356, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/core/management/base.py", line 283, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/core/management/base.py", line 327, in execute
    self.check()
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/core/management/base.py", line 359, in check
    include_deployment_checks=include_deployment_checks,
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 62, in _run_checks
    issues.extend(super(Command, self)._run_checks(**kwargs))
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/core/management/base.py", line 346, in _run_checks
    return checks.run_checks(**kwargs)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/core/checks/registry.py", line 81, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/core/checks/urls.py", line 16, in check_url_config
    return check_resolver(resolver)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/core/checks/urls.py", line 26, in check_resolver
    return check_method()
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/urls/resolvers.py", line 254, in check
    for pattern in self.url_patterns:
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/utils/functional.py", line 35, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/urls/resolvers.py", line 405, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/utils/functional.py", line 35, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/urls/resolvers.py", line 398, in urlconf_module
    return import_module(self.urlconf_name)
  File "/usr/local/python2.7.14/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/home/asilver/pythonProjects/django/sdntest2/sdnweb/sdnlabs2/sdnlabs2/urls.py", line 24, in <module>
    url(r'^inventory/', include('inventory.urls')),
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/conf/urls/__init__.py", line 50, in include
    urlconf_module = import_module(urlconf_module)
  File "/usr/local/python2.7.14/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/home/asilver/pythonProjects/django/sdntest2/sdnweb/sdnlabs2/inventory/urls.py", line 3, in <module>
    from . import views
  File "/home/asilver/pythonProjects/django/sdntest2/sdnweb/sdnlabs2/inventory/views.py", line 5, in <module>
    from .tables import DeviceInstanceTable, PerfvRtrOnlyTable, HardwareTable
  File "/home/asilver/pythonProjects/django/sdntest2/sdnweb/sdnlabs2/inventory/tables.py", line 3, in <module>
    from .models import DeviceInstance, PerfvRtrOnly, Hardware
  File "/home/asilver/pythonProjects/django/sdntest2/sdnweb/sdnlabs2/inventory/models.py", line 8, in <module>
    class Hardware(models.Model):
  File "/home/asilver/.virtualenvs/webtest2/lib/python2.7/site-packages/django/db/models/base.py", line 118, in __new__
    "INSTALLED_APPS." % (module, name)
RuntimeError: Model class inventory.models.Hardware doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

这是该类的代码:

class PerfvRtrOnlyFilter(django_filters.FilterSet):

    deviceName = django_filters.ModelMultipleChoiceFilter(name='deviceName', label='Device', queryset=DeviceInstance.objects.all())
    hardware = django_filters.ModelMultipleChoiceFilter(name='hardware', label='Hardware', queryset=Hardware.objects.all())
    jdmVersion = django_filters.ModelMultipleChoiceFilter(name='jdmVersion', label='JDM Version', queryset=Software.objects.all().filter(component__function='hypervisor'))
    vrtrVersion = django_filters.ModelMultipleChoiceFilter(name='vrtrVersion', label='vRTR Version', queryset=Software.objects.filter(component__function='vrtr'))
    vrtr = django_filters.ModelMultipleChoiceFilter(name='vrtr', label='vRouter', queryset=Component.objects.filter(function='vrtr'))
    jflow = django_filters.BooleanFilter(name='jflow', label='Jflow')

    ##################################################
    # Mulitple Choice Filter for topoName
    ##################################################
    partial_query_set = PerfvRtrOnly.objects.values_list('topoName')
    choiceList = get_unique_choice_list(partial_query_set)
    topoName = django_filters.MultipleChoiceFilter(choices=choiceList, label='Topology')

    ##################################################
    # Mulitple Choice Filter for frameSize
    ##################################################
    partial_query_set = PerfvRtrOnly.objects.values_list('frameSize')
    choiceList = get_unique_choice_list(partial_query_set)
    frameSize = django_filters.MultipleChoiceFilter(choices=choiceList, label='Frame Size')

    ##################################################
    # Mulitple Choice Filter for Run Date
    ##################################################
    partial_query_set = PerfvRtrOnly.objects.values_list('runDate')
    choiceList = get_unique_choice_list(partial_query_set)
    runDate = django_filters.MultipleChoiceFilter(choices=choiceList, label='Run Date')

    ##################################################
    # Single Choice Filter for Bridging Technology
    ##################################################
    partial_query_set = PerfvRtrOnly.objects.values_list('bridgeTech')
    choiceList = get_unique_choice_list(partial_query_set)
    bridgeTech = django_filters.ChoiceFilter(choices=choiceList, label='Bridge Tech')

    ##################################################
    # Mulitple Choice Filter for Traffic Type
    ##################################################
    partial_query_set = PerfvRtrOnly.objects.values_list('trafficType')
    choiceList = get_unique_choice_list(partial_query_set)
    trafficType = django_filters.MultipleChoiceFilter(choices=choiceList, label='Traffic Type')

    class Meta:
        model = PerfvRtrOnly
        fields = ['qos', 'officialRun',]

这是位于文件 lib.py 中的函数“get_unique_choice_list”的代码:

#####################################################################################
# This function is used to create a choice list for a filter in filter.py
# querySet is a querySet object and it should only contain one field of the table
# There may be duplicate entries in that list and each item in the list is a tupple.
#####################################################################################
def get_unique_choice_list(querySet):

    list_1= []
    y = set(querySet)
    for i in y:
        list_1.append(i)

    ######################################################################################################
    # At this point we have a list of tuples which is no good.  Ultiimately we need a tuple of tuples...
    # As show below in the example. An enumerated tuple
    # If we print list_1 we have this at this point:
    #In [38]: print list_1
    # [(u'J1101',), (u'D1001',), (u'H1101',), (u'D1',), (u'G1',), (u'G1001',)]
    ######################################################################################################
        list_2 = []
    for i in list_1:
        a = i[0]
        list_2.append(a)

    list_2.sort()
    #######################################################################
    # At this point we should have a list of topologies and no more tuples
    # print list_2
    # [u'J1101', u'D1001', u'H1101', u'D1', u'G1', u'G1001']
    #######################################################################


    #######################################################################
    # We now need to create a list of tuples
    #######################################################################
    list_3 = []
    for i in list_2:
        new_item = (str(i),str(i))
        list_3.append(new_item)

    return list_3

【讨论】:

    【解决方案3】:

    终于完成了这项工作,但需要蛮力才能做到。我删除了 django 应用程序中的所有文件并开始了一个新项目和应用程序。然后我添加了 models.py 文件并更新了 settings.py 文件。那时我运行了 makemigrations 并且一切正常。最后,我将其余文件重新添加到项目中,现在一切正常……至少现在是这样。我们将看看下次我进行任何模型更改并再次发出 makemigrations 命令时会发生什么......

    【讨论】:

      【解决方案4】:

      尝试:

      • 从 settings.py 中取消注册您的应用
      • 运行 python manage.py migrate
      • 重新注册您的应用
      • 从您的应用中删除(保留备份)迁移文件夹
      • 运行 python manage.py makemigrations
      • 比 python manage.py 迁移

      【讨论】:

      • 我尝试了上述步骤,但无法通过第二步。当我尝试运行 migrate 命令时它不起作用 w
      猜你喜欢
      • 1970-01-01
      • 2021-01-23
      • 2016-08-02
      • 1970-01-01
      • 2023-03-14
      • 2012-07-21
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多