python - 向models.py添加了额外的模型,但我得到`OperationalError:没有这样的表`
问题描述
我的 webappwebapp
已经在models.py
. 让我们称它们为Model1
and Model2
。它们已构建,它们可以工作,它们都已在我的 webapp 中注册,admin.py
并且整个 webapp 正在运行。我可以转到管理控制台 ( /admin
) 并查看两个表都在那里,我可以查看它们。
我想添加第三个表,Model3
. 我在其中写出了代码models.py
——它看起来与其他两个模型非常相似,只是字段略有不同。我修改admin.py
以包含它,就像其他两个一样。然后我删除了该migrations
文件夹并执行了以下 Django 命令:
$ python manage.py makemigrations webapp
Migrations for 'webapp':
webapp/migrations/0001_initial.py
- Create model Model1
- Create model Model3
- Create model Model2
$ python manage.py migrate webapp
Operations to perform:
Apply all migrations: admin, webapp, auth, contenttypes, sessions
Running migrations:
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
我不确定实际上正在运行的那些迁移是什么(我最近没有改变Model1
)Model2
。当我运行 webapp 并进入管理控制台时,与和Model3
一起出现,但单击它会产生以下错误:Model1
Model2
Internal Server Error: /admin/webapp/model3/
Traceback (most recent call last):
File "/.../venv/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/.../venv/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py", line 383, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: no such table: webapp_model3
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/.../venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/.../lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
...
(24 frames omitted)
...
File "/.../venv/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/.../venv/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py", line 383, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such table: webapp_model3
当我尝试以编程方式访问模型时,我也会遇到这种类型的错误(从工作正常导入它models.py
,但实际上访问Model3.objects
会触发错误)。
我确定我忘了做某事,但我不知道该做什么。
这是使用 Django 提供的开箱即用的默认 sqlite 数据库。我不能完全删除我的数据库 - 由于与此问题无关的原因,必须使用它当前拥有的相同信息重新填充它是很麻烦的。我可以根据需要从最近的备份中恢复,并且在测试解决方案时我一直在这样做。过去,我能够对数据库进行修改,Model1
而Model2
无需删除和重新创建数据库。
生成的内容webapp/migrations/0001_initial.py
有:
# Generated by Django 2.2.5 on 2019-11-20 18:55
import webapp.models
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Model1',
fields=[
('key1', models.FloatField(blank=True, primary_key=True, serialize=False)),
('key2', models.CharField(default=None, max_length=10)),
('key3', models.CharField(default=None, max_length=100)),
('key4', models.TextField(blank=True, default=None, null=True)),
('key5', models.ImageField(blank=True, default=None, upload_to=webapp.models.func1)),
],
),
migrations.CreateModel(
name='Model3',
fields=[
('NewKey1', models.FloatField(blank=True, primary_key=True, serialize=False)),
('NewKey2', models.CharField(default=None, editable=False, max_length=10)),
('NewKey3', models.CharField(default=None, editable=False, max_length=100)),
('NewKey4', models.TextField(blank=True, default=None, editable=False, null=True)),
('NewKey5', models.TextField()),
],
),
migrations.CreateModel(
name='Model2',
fields=[
('KeyA', models.IntegerField(primary_key=True, serialize=False)),
('KeyB', models.CharField(default=None, max_length=100)),
('KeyC', models.CharField(default=None, max_length=100)),
('KeyD', models.CharField(default=None, max_length=100)),
('KeyE', models.TextField(blank=True, default=None, null=True)),
('KeyF', models.ImageField(default=None, upload_to=webapp.models.func2)),
('KeyG', models.ImageField(default=None, upload_to=webapp.models.func3)),
('KeyH', models.BooleanField(default=False)),
('KeyI', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='webapp.Model1')),
],
),
]
解决方案
Django 使用django_migrations
表来跟踪所有已应用的迁移。所以大概0001_initial
已经应用了,因此 Django 没有运行它migrate
。
你需要:
- 自己创建一个新的迁移文件,例如
0001_auto_20191120.py
- 只放文件中的
migrations.CreateModel
块Model3
0001_initial.py
- 放置
0001_initial
为依赖项(放入dependencies
迁移文件列表中) - 跑
python manage.py migrate webapp
推荐阅读
- kubernetes-helm - 如何使用内部服务 pod 之间的权重来路由流量以进行金丝雀发布?
- c# - Forms..NET 3.5 的 ShowDialog 和 Dispose 问题
- python - 试图用前一行计算行的值
- jenkins - 如何更改 Jenkins 保留的构建数量?
- android - 前台服务在android oreo中不起作用
- quartz-scheduler - Quartz调度程序在iis中一段时间后停止工作
- perl - Perl:打印标准输入中数字最大的行
- java - JPA自定义转换器中的空指针异常-Spring boot
- xamarin - ZXingScannerView 在导航返回时抛出由 StopScanningAsync 导致的意外时间调用方法
- jquery - jQuery 动态元素点击处理程序也不工作