我在Mezzanine中使用Django1.7.我创建了存储在单独的应用程序"配置文件"中的简单配置文件(根据Mezzanine文档):
class RoadmapProfile(models.Model):
user = models.OneToOneField("auth.User")
fullname = models.CharField(max_length=100, verbose_name="Full name")
Run Code Online (Sandbox Code Playgroud)
创建迁移返回:
Migrations for 'profiles':
0001_initial.py:
- Create model RoadmapProfile
Run Code Online (Sandbox Code Playgroud)
当我运行"迁移配置文件"时:
Operations to perform:
Apply all migrations: profiles
Running migrations:
No migrations to apply.
Run Code Online (Sandbox Code Playgroud)
问题是,当我尝试打开与mezzanine.accounts相关的任何页面(例如更新帐户)时,它会崩溃:
OperationalError at /accounts/update/
no such column: profiles_roadmapprofile.fullname
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
Zul*_*deh 105
'profiles'从表中删除行'django_migrations'.python manage.py makemigrations并python manage.py migrate命令.pha*_*152 39
我是一个Django新手,我也遇到了同样的问题.这些答案对我不起作用.我想分享我是如何解决问题的,可能会节省很多时间.
我对模型进行了更改,我想将这些更改应用到数据库中.
在shell上运行:
python manage.py makemigrations app-name
python manage.py migrate app-name
Run Code Online (Sandbox Code Playgroud)
数据库中没有任何更改
但是当我检查数据库模式时,它仍然是旧模式
manage.py migrate app-name,Django检查数据库中的django_migrations表以查看已经应用了哪些迁移,并将跳过这些迁移.从该表(delete from django_migrations where app = "app-name")中删除app ="my-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示例: 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 /(迁移文件)中的文件.因此,那些迁移文件和我的数据库彼此不一致.所以我会尝试不修改那些迁移文件,除非我真的知道我在做什么.
ACi*_*der 28
听起来你的初始迁移是伪造的,因为该表已经存在(可能有一个过时的模式):
https://docs.djangoproject.com/en/1.7/topics/migrations/#adding-migrations-to-apps
"这将为您的应用程序进行新的初始迁移.现在,当您运行迁移时,Django将检测到您有初始迁移,并且它想要创建的表已经存在,并将迁移标记为已应用."
否则你会得到一个没有这样的表错误:)
[编辑]你清理了应用迁移表吗?这也是非应用迁移的常见原因.
mas*_*ood 12
1-运行python manage.py makemigrations <appname>
2- run python manage.py sqlmigrate <appname> <migrationname>- 你会在appname下的migration文件夹中找到migrationname(当然没有'.py'扩展名)
3-复制结果的所有文本#生成
4-的所有sql命令转到您的数据库ide并粘贴为新查询并运行它
现在所有更改都应用于您的数据库
就我而言,我写的是这样的:
python manage.py makemigrations --empty yourappname
python manage.py migrate yourappname
要么:
Django在django_migrations表中跟踪所有应用的迁移.因此,只需删除django_migrations表中与您的app相关的所有行,例如:
DELETE FROM django_migrations WHERE app='您-APP-名'
然后做:
python manage.py makemigrations
python manage.py migrate
小智 5
python manage.py migrate --fake APPNAME zero
Run Code Online (Sandbox Code Playgroud)
这将使您迁移到假货。现在您可以运行迁移脚本
python manage.py migrate APPNAME
Run Code Online (Sandbox Code Playgroud)
将创建表,您可以解决您的问题。
这里的问题是某处的假迁移。基本上在您的数据库中,从您的模型创建的表不存在,尽管该表之前存在过某个时间,但由于旧更新,无论它可能是什么。问题是 django 已经进行了这些迁移,因此表必须存在,因此可以忽略迁移,但在 Admin 中出现错误“table_doesnt_exist”。
解决方案:
1.- 确保保存该模型中的所有数据。
2.- 访问您的数据库并运行此查询。
SELECT * FROM django_migrations;
Run Code Online (Sandbox Code Playgroud)
3.- 从查询生成的列表中获取 id。这些是 Django 到目前为止已迁移的迁移,因此 TABLES MUST EXIST。在您的情况下,我会查找名为roadmapprofile的行,因为这是您的模型的名称。
4.- 现在让我们使用 id 从这个表中删除这一行,
DELETE FROM django_migrations where django_migrations.id in (value_id1, value_id2 ... value_idN);
Run Code Online (Sandbox Code Playgroud)
用各自的 id 替换 value_id1 和 value_id2。它可能只有一个或多个,所以如果您没有看到超过 1 个 id,请不要担心,这意味着当前应用程序下只存在一个模型。
5.- 将应用程序迁移到零
manage.py migrate <app_name> zero
Run Code Online (Sandbox Code Playgroud)
6.- 删除应用程序迁移文件夹中的所有迁移文件
7.- 创建迁移
manage.py makemigrations
Run Code Online (Sandbox Code Playgroud)
8.- 删除这些注册表并运行 manage.py migrate 后;由于这些模型的“迁移将不存在”,Django 将被迫为这些模型运行迁移。
manage.py migrate
Run Code Online (Sandbox Code Playgroud)
就是这样。按照这些说明操作应该不会有任何问题。顺便说一下,您不应该丢失来自其他模型的任何数据,因为您只是迁移和更新与这些特定模型相关的表。
小智 5
这是一个非常令人困惑的话题。django 将所有应用的迁移存储在名为 django_migrations 的表中。执行这个sql(我正在使用postgres。所以在查询工具部分)
select * from django_migrations where app='your appname' (app in which u have issue with).
Run Code Online (Sandbox Code Playgroud)
这将列出该应用程序的所有已应用的迁移。
转到您的 app/migration 文件夹并检查所有的 migrations 。找到与您的错误相关的迁移文件。创建表或添加或修改列的文件。
在 django_migrations 表中查找此迁移文件的 id( select * from django_migrations where app='your app') 。
然后做 :
delete from django_migrations where id='id of your migration';
Run Code Online (Sandbox Code Playgroud)
如果您有多个与您的问题相关的迁移文件,请删除多个 ID。
现在重新申请迁移
Python manage.py migrate yourappname
Run Code Online (Sandbox Code Playgroud)
第二个选择
删除应用程序中出现问题的表。
从 app/migrations 文件夹中删除该应用程序的所有迁移。(不要从该文件夹中删除init .py)。
现在运行
python manage.py makemigrations 应用程序名称
现在运行
python manage.py migrate appname
| 归档时间: |
|
| 查看次数: |
82698 次 |
| 最近记录: |