django.db.utils.OperationalError: (1054, "Unknown column

django.db.utils.OperationalError: (1054, "Unknown column

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

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

调试后发现new_leads方法有exclude of两个字段collection和delivery。如果我们把它排除在外,一切都很好。我的意思是不要检查另一个,如果我们同时包含两个过滤器,我们就会遇到问题。

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

查询集包含以下方法

    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 处于正确状态

更新

问题与 MYSQL 在创建 Having 子句时使列在 select 语句中可用有关。参考 - 。 在这种情况下,Django 不会添加为要 selected 的列。因此错误。 我需要一些如何找到一种方法将其添加到带有其他参数的 select 子句中。

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

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

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

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

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

这不是迁移问题。

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"))

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

这是这个问题的答案:

第 1 步。您需要伪造迁移

python manage.py migrate --fake

步骤 2. 再次迁移

python manage.py migrate

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

步骤 4. 进行迁移并再次迁移

python manage.py makemigrations
python manage.py migrate