Postgresql
,Django 2.0
,Python 3.6.4
运行将字段desktop_pay
的名称更改为pay
的迁移后,我在运行manage.py test
列pay
时收到错误消息不存在。
以下是迁移:
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没有找到专栏?我该怎么调试呢?
答案 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"])