Django测试错误:列不存在

时间:2018-05-18 18:27:29

标签: python django postgresql

PostgresqlDjango 2.0Python 3.6.4

运行将字段desktop_pay的名称更改为pay的迁移后,我在运行manage.py testpay时收到错误消息不存在。

以下是迁移:

from django.db import migrations


class Migration(migrations.Migration):

    dependencies = [
        ('instructions', '0055_auto_20180517_1508'),
    ]

    operations = [
        migrations.RenameField(
            model_name='instruction',
            old_name='desktop_pay',
            new_name='pay',
        ),
    ]

这是错误:

> python .\manage.py test
Creating test database for alias 'default'...
Traceback (most recent call last):
  File "C:\Python36\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
psycopg2.ProgrammingError: column instructions_instruction.pay does not exist
LINE 1: "...on"."quota", "instructions_instruction"."target", "instructi...
                                                              ^

但是,如果我启动psql提示符,我可以清楚地看到该列确实存在,至少在" real"表

mydatabase=> \d+ instructions_instruction
                                                              Table "public.instructions_instruction"
       Column        |          Type          | Collation | Nullable |                       Default                        | Storage  | Stats target | Description
---------------------+------------------------+-----------+----------+------------------------------------------------------+----------+--------------+-------------
 id                  | integer                |           | not null | nextval('instructions_instruction_id_seq'::regclass) | plain    |              |
 quota               | smallint               |           | not null |                                                      | plain    |              |
 pay                 | numeric(5,2)           |           | not null |                                                      | main     |              |

### etc...

这里发生了什么?为什么Django没有找到专栏?我该怎么调试呢?

2 个答案:

答案 0 :(得分:2)

当我的迁移以某种方式搞砸时,我遇到了这些“列不存在”错误,有时这种情况发生在我意外删除/覆盖迁移时,但我也只是通过运行典型的迁移来实现我无法解释。

所以我猜你必须在你的迁移中查明问题。对我有用的是,在确认我的架构实际上是我想要的之后,在场景#2 here的帮助下重置迁移。

答案 1 :(得分:0)

我也遇到了这个问题。首先,我不知道为什么此错误仅在测试时出现。

然后我调查了回溯,发现Django无法运行与Django找不到的列无关的迁移之一。

这是手动编写的迁移,以使用自动生成的值填充对象uuid字段。我像往常一样导入模型Post

import uuid
from django.db import migrations

from posts.models import Post


def gen_uuid(apps, schema_editor):
    for post in Post.objects.all():
        post.uuid = uuid.uuid4()
        post.save(update_fields=["uuid"])


class Migration(migrations.Migration):

    dependencies = [
        ("posts", "0014_post_uuid"),
    ]

    operations = [
        migrations.RunPython(gen_uuid, reverse_code=migrations.RunPython.noop),
    ]

我不清楚为什么,但是这段代码在准备测试数据库时中断了迁移(并且可以在测试模式之外正常工作)。因此,以下任何迁移都不适用于测试数据库,并且会导致column does not exist错误。

那该怎么办?使用apps.get_model代替Django官方文档中有关编写迁移https://docs.djangoproject.com/en/3.1/howto/writing-migrations/#migrations-that-add-unique-fields的描述。

类似这样的东西。

import uuid
from django.db import migrations
    
def gen_uuid(apps, schema_editor):
    Post = apps.get_model("posts", "Post")
    for post in Post.objects.all():
        post.uuid = uuid.uuid4()
        post.save(update_fields=["uuid"])