我在Mezzanine中使用Django1.7。我创建了简单的配置文件(根据Mezzanine文档)存储在单独的应用程序"配置文件":
class RoadmapProfile(models.Model):
user = models.OneToOneField("auth.User")
fullname = models.CharField(max_length=100, verbose_name="Full name")
创建迁移返回:
Migrations for 'profiles':
0001_initial.py:
- Create model RoadmapProfile
当我运行"迁移配置文件":
Operations to perform:
Apply all migrations: profiles
Running migrations:
No migrations to apply.
问题是,当我尝试打开与mezzanine.accounts相关的任何页面(例如更新帐户)时,它会崩溃:
OperationalError at /accounts/update/
no such column: profiles_roadmapprofile.fullname
我做错了什么?
答案 0 :(得分:99)
'profiles'
删除行'django_migrations'
。python manage.py makemigrations
和python manage.py migrate
命令。答案 1 :(得分:33)
我是Django新手,我也遇到了同样的问题。这些答案对我没有用。我想分享一下如何解决问题,可能会节省很多时间。
我对模型进行了更改,我想将这些更改应用到数据库中。
在shell上运行:
python manage.py makemigrations app-name
python manage.py migrate app-name
数据库
但是当我检查数据库架构时,它仍然是旧架构
manage.py migrate app-name
时,Django会检查数据库中的django_migrations表,以查看哪些迁移已经应用,并将跳过这些迁移。使用app =" my-app-name"删除记录从该表(delete from django_migrations where app = "app-name"
)。清除我的迁移文件夹并运行python manage.py makemigration my-app-name
,然后python manage.py migrate my-app-name
。最投票的答案表明了这一点。但这也不起作用。
因为有一个现有的表,而我正在创建的是"初始迁移"所以Django决定已经应用了初始迁移(因为它看到该表已经存在)。问题是现有表具有不同的模式。
删除现有表(使用旧架构),进行初始迁移,然后再次应用。这将起作用(它对我有用),因为我们有一个"初始迁移"并且我们的数据库中没有相同名称的表。 (提示:我使用python manage.py migrate my-app-name zero
快速删除数据库中的表格
问题?您可能希望将数据保留在现有表中。你不想丢弃它们并丢失所有数据。
使用与现有表格相同的架构创建初始迁移,步骤如下:
修改models.py以匹配数据库中的当前表
删除"迁移"
运行python manage.py makemigrations your-app-name
使用django_migrations.app = your-app-name在django_migrations中删除所有字段
如何执行此操作取决于您使用的是哪个DB
MySQL示例:delete from django_migrations where app = "your-app-name";
修改models.py以匹配新架构(例如,您现在需要的架构)
运行python manage.py makemigrations your-app-name
运行python manage.py migrate your-app-name
这对我有用。我设法保留现有数据。
我遇到所有这些麻烦的原因是我删除了some-app / migrations /(迁移文件)中的文件。因此,那些迁移文件和我的数据库彼此不一致。所以除非我真的知道自己在做什么,否则我会尝试不修改这些迁移文件。
答案 2 :(得分:27)
听起来你的初始迁移是伪造的,因为该表已经存在(可能是过时的架构):
https://docs.djangoproject.com/en/1.7/topics/migrations/#adding-migrations-to-apps
"这将为您的应用进行新的初始迁移。现在,当你 运行迁移, Django将检测到您有初始迁移和 它想要创建的表已经存在,并将标记 已经应用的迁移。"
否则你会得到一个没有这样的表错误:)
[edit]你清理了应用迁移表吗?这也是非应用迁移的常见原因。
答案 3 :(得分:12)
1- run python 15
2- run python alert("End Of the loop.");
- 你会在appname下的migration文件夹中找到migrationname(当然没有'.py'扩展名)
3-复制结果的所有文本#生成
的所有sql命令
4-转到您的数据库ide并粘贴为新查询并运行它
现在所有更改都应用于您的数据库
答案 4 :(得分:6)
就我而言,我写的是这样的:
python manage.py makemigrations
- 空 yourappname
python manage.py migrate yourappname
或:
Django跟踪django_migrations表中的所有应用迁移。因此,只需删除django_migrations表中与您的应用相关的所有行,如:
DELETE FROM django_migrations WHERE app='
您-APP-名称强> '
然后执行:
python manage.py makemigrations
python manage.py migrate
答案 5 :(得分:4)
python manage.py migrate --fake APPNAME zero
这会使您的迁移变为假冒。现在您可以运行迁移脚本
python manage.py migrate APPNAME
将创建表格并解决您的问题。干杯!!!
答案 6 :(得分:2)
这里的问题是某个地方的虚假迁移。基本上,在数据库中,从模型创建的表不存在,由于存在旧的更新或可能存在的任何更新,因此该表之前曾存在过。问题在于django已经进行了这些迁移,因此表应该存在,因此可以忽略迁移,但是在Admin中会出现错误“ table_doesnt_exist”。
解决方案:
1。-确保保存该模型中的所有数据。
2.-访问您的数据库并运行此查询。
SELECT * FROM django_migrations;
3.-从查询生成的列表中获取ID。这些是Django到目前为止已迁移的迁移,因此表应该存在。在您的情况下,我会查找名为 roadmapprofile 的行,因为这是您模型的名称。
4.-现在让我们使用ID
从此表中删除此行 DELETE FROM django_migrations where django_migrations.id in (value_id1, value_id2);
用相应的ID替换value_id1和value_id2。它可能只有一个或多个,所以如果看不到超过1个id,请不要担心,这意味着当前应用程序下仅存在一个模型。
5.-将应用迁移到零
manage.py migrate <app_name> zero
6.-删除应用程序迁移文件夹中的所有迁移文件
7.-创建迁移
manage.py makemigrations
8.-一旦删除了这些注册表,并运行manage.py migration;由于这些模型“迁移不存在”,Django将被迫为这些模型运行迁移。
manage.py migrate
就是这样。遵循此说明,您应该不会有任何问题。顺便说一句,您不应从其他模型中删除任何数据,因为您仅迁移和更新与那些特定模型相关的表。
答案 7 :(得分:2)
我的问题是迁移中的文件夹中没有__init__.py
个文件。将__init__.py
添加到包含它们的文件夹后,manage.py migrate
找到并运行它们。
答案 8 :(得分:1)
这是一个非常令人困惑的话题。 django将所有应用的迁移存储在名为django_migrations的表中。 执行此sql(我使用的是postgres。因此在查询工具部分)
select * from django_migrations where app='your appname' (app in which u have issue with).
这将列出该应用程序的所有已应用迁移。
转到您的应用程序/迁移文件夹,然后检查所有迁移。找到与您的错误关联的迁移文件。创建表或添加或修改列的文件。
在django_migrations表中查找此迁移文件的ID(从django_migrations中选择*,其中app ='your app')。
然后做:
delete from django_migrations where id='id of your migration';
如果您有多个与问题相关联的迁移文件,请删除多个ID。
现在重新应用迁移
Python manage.py migrate yourappname
第二个选项
将表格拖放到您遇到问题的应用中。
从app / migrations文件夹中删除该应用程序的所有迁移。(请勿从该文件夹中删除 init .py)。
现在运行
python manage.py makemigrations应用程序名称
现在运行
python manage.py migrate appname
答案 9 :(得分:0)
@ phanhuy152有最好的答案。只是为了加上我的两分钱:
他的解决方案是:
migrations
文件夹makemigrations
恢复迁移文件的初始状态makemigrations
再次migrate
将更新应用于表格。但在我的情况下,我在models.py
文件中有几个模型,在最后一步,Django抱怨Table xxx already exists
,因为初始迁移文件打算再次创建xxx表,当我们只是不要(并且不想)放弃其他桌子。
在这种情况下,为了保存数据,我们必须告诉Django将它们留在migrate
中。我们只是这样做:(假设A类是我们改变的,B类,C类保持相同):
models.py
:
from django.db import models
class A(models.Models):
...
class B(models.Models):
class Meta:
managed = False # tell Django to leave this class alone
...
class C(models.Models):
class Meta:
managed = False # tell Django to leave this class alone
在构建初始迁移后添加这些行。
所以,现在的过程是:
managed = False
添加到其他类makemigrations
应用Meta
更改。你会看到类似的东西:输出:
Migrations for 'backEnd':
backEnd/migrations/0002_auto_20180412_1654.py
- Change Meta options on toid
- Change Meta options on tprocessasinc
- Change Meta options on tservers
- Change Meta options on tsnmpserver
migrate
将其应用于数据库migrate
再次。Meta
类,让Django再次管理其他类。 makemigrations
,再次migrate
。现在您拥有模型的所有结构和数据,而不会丢失以前存储在数据库中的部分。
答案 10 :(得分:0)
我有同样的问题。确保已创建应用程序的迁移文件夹(YOURAPPNAME /迁移)。删除文件夹并输入命令:
python manage.py migrate --fake
python manage.py makemigrations <app_name>
python manage.py migrate --fake-initial
我在models.py的每个类中插入了这些行:
class Meta:
app_label = '<app_name>'
这解决了我的问题。
答案 11 :(得分:0)
对我而言,提供的解决方案均无效。原来,我正在使用不同的设置进行迁移(manage.py
)和运行(wsgi.py
)。 manage.py
中定义的设置使用了本地数据库,而wsgi.py
设置中使用了生产数据库。因此,生产数据库从未迁移。
使用:
django-admin migrate
事实证明,用于迁移会更好,因为您必须指定用作here的设置。
答案 12 :(得分:0)
在迁移过程进行中,也许您的模型未链接。
尝试将其导入文件urls.py
from models import your_file
答案 13 :(得分:0)
如果您将GIT用于控制版本,并且在某些提交中添加了db.sqlite3,则GIT将保留数据库的某些引用,因此在执行“ python manage.py migration”时,该引用将反映在新的数据库。我建议执行以下命令:
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch 'db.sqlite3' HEAD
对我有用:)
答案 14 :(得分:0)
使用PostgreSQL我遇到了同样的问题 我清除了迁移文件夹和迁移缓存文件夹中的所有迁移,然后在我的PGADMIN中运行:
delete from django_migrations where app='your_app'
答案 15 :(得分:0)
解决方案的原因是您必须删除您的数据。 如果您想避免这种情况 + 您正在使用 Sqlite ,请按照以下流程操作:
答案 16 :(得分:0)
我所做的只是删除了 django-migrations
表的最后一行。很明显这是要删除的正确迁移,因为它的名称与我生成的迁移相同但无法应用。