【问题标题】:django.db.utils.OperationalError: (1054, "Unknown columndjango.db.utils.OperationalError:(1054,“未知列
【发布时间】:2018-04-10 23:35:36
【问题描述】:

一个有趣的问题。 获取未知列异常 -- 请查找堆栈跟踪

我尝试获取新的潜在客户列表和回复的潜在客户。我合并它们。当我合并它们时有一个例外。

调试后发现new_leads方法排除了采集和投放两个字段。如果我们把它排除在外,一切都很好。我的意思是不要检查另一个,如果我们同时包含我们有问题的过滤器。

我尝试使用过滤器/排除等,但没有用。

查询集包含以下方法

    def all_leads_related_to_user(self, user):
    """ User new and past leads
    Use this queryset for performing lead search.
    """
    new_leads = self.new_leads_for_user(user)
    responded_leads = self.leads_responded_by_user(user)
    all_leads = (new_leads | responded_leads).distinct() <= Issue is here.
    return all_leads

    def new_leads_for_user(self, user):
     ....

    # User's location filter
    if user.sub_region_excluded_list:
        sub_region_exclude_list = [10, 12]
        qs = qs.exclude( Q(collection_point__sub_region_id__in=sub_region_exclude_list) |
                        Q(delivery_point__sub_region_id__in=sub_region_exclude_list)) 

                   # <== Make it just one exclude it works.


Model 

class Suburb(models.Model):
    state = models.ForeignKey(State, blank=False)
    sub_region = models.ForeignKey(SubRegion, blank=False)
    postcode = models.CharField(_('postcode'), blank=False, max_length=10)
    name = models.CharField(_('suburb name'), blank=False, max_length=200)

class Load(models.Model):
.....

collection_point = models.ForeignKey(Suburb, related_name='collection_point', on_delete=models.SET_NULL, null=True)
delivery_point = models.ForeignKey(Suburb, related_name='delivery_point', on_delete=models.SET_NULL, null=True)

堆栈跟踪:-

    >>> Load.objects.all_leads_related_to_user(User.objects.all()[0])
Load.objects.all_leads_related_to_user(User.objects.all()[0])
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/models/query.py", line 226, in __repr__
    data = list(self[:REPR_OUTPUT_SIZE + 1])
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/models/query.py", line 250, in __iter__
    self._fetch_all()
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/models/query.py", line 1103, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/models/query.py", line 53, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 886, in execute_sql
    raise original_exception
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 876, in execute_sql
    cursor.execute(sql, params)
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/backends/utils.py", line 80, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/data/fq/venv/lib/python3.4/site-packages/django/utils/six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/backends/mysql/base.py", line 101, in execute
    return self.cursor.execute(query, args)
  File "/data/fq/venv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 250, in execute
    self.errorhandler(self, exc, value)
  File "/data/fq/venv/lib/python3.4/site-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
    raise errorvalue
  File "/data/fq/venv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 247, in execute
    res = self._query(query)
  File "/data/fq/venv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 411, in _query
    rowcount = self._do_query(q)
  File "/data/fq/venv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 374, in _do_query
    db.query(q)
  File "/data/fq/venv/lib/python3.4/site-packages/MySQLdb/connections.py", line 292, in query
    _mysql.connection.query(self, query)
django.db.utils.OperationalError: (1054, "Unknown column 'locations_suburb.sub_region_id' in 'having clause'")
>>> 

我正在使用 MySqlDB

注意:-

所有迁移都已应用且 Db 处于正确状态

更新

问题与在创建Having 子句时在select 语句中可用的MYSQL madating 列有关。参考—— Unknown column in 'having clause'。 在这种情况下,Django 没有添加为要选择的列。因此错误。 我需要一些如何找到一种方法将其与其他参数一起添加到 select 子句中。

【问题讨论】:

    标签: django django-models django-orm


    【解决方案1】:

    由于我的表没有任何数据,我将其删除并在 MySQL 上重新创建,然后从 Django 中删除。最后我在 Django 上重新创建,从而解决了错误。

    【讨论】:

      【解决方案2】:

      这是这个问题的答案:

      第 1 步。您需要伪造迁移

      python manage.py migrate --fake
      

      第 2 步。再次迁移

      python manage.py migrate
      

      第 3 步。注释掉出现错误的列,例如"不能删除'地址'

      第 4 步。进行迁移并再次迁移

      python manage.py makemigrations
      python manage.py migrate
      

      【讨论】:

        【解决方案3】:

        这不是迁移问题。

        当有一个HAVING 子句时,MYSQL 要求选择这些参数,如果没有选择它会抛出一个异常。 因此,我不得不通过以下方式强制 Django 包含这两个字段:

        qs = qs.annotate(collection_point__sub_region_id = F("collection_point__sub_region_id"),
                         delivery_point__sub_region_id = F("delivery_point__sub_region_id"))
        

        【讨论】:

          【解决方案4】:

          这通常会在您尚未进行或应用迁移时弹出。具体来说,当您在 Django(或任何 ORM)中修改任何模型的字段时,您需要通知 SQL 服务器以便它可以在其表中反映它。现代 Django 通过一系列迁移来实现这一点,因此,如果您拥有项目生命周期中任何时间的数据,您可以通过简单地向前或向后运行迁移来在历史上任何时间的代码上运行它。

          长话短说,MySQL 声称 sub_region 字段不存在。您需要同步表格以反映您的模型。

          有两个步骤,进行迁移并在您的服务器上运行它们,如下所示为您的 locations 应用程序。 在运行第二个命令之前进行备份,尤其是在 MySQL 或 SQLite 上!

          $ python manage.py makemigrations locations
          $ python manage.py migrate locations 
          

          这将导致数据库服务器创建列,并且您不应再收到 OperationalError。

          【讨论】:

          • 我已经完成了所有的迁移。而不是 qs = qs.exclude( Q(collection_point__sub_region_id__in=sub_region_exclude_list) | Q(delivery_point__sub_region_id__in=sub_region_exclude_list)) 如果我们写 qs = qs.exclude( Q(collection_point__sub_region_id__in=sub_region_exclude_list) ) 它可以工作
          猜你喜欢
          • 2020-02-01
          • 2012-10-14
          • 2012-10-08
          • 1970-01-01
          • 1970-01-01
          • 2015-02-22
          • 2016-04-01
          • 2012-03-09
          • 2017-03-17
          相关资源
          最近更新 更多