Django 1.7 – 在迁移之后迁移时迁移的“没有迁移应用”
我使用Django1.7和Mezzanine。 我创build简单的configuration文件(根据夹层文档)存储在单独的应用程序“configuration文件”中:
class RoadmapProfile(models.Model): user = models.OneToOneField("auth.User") fullname = models.CharField(max_length=100, verbose_name="Full name")
创build迁移回报:
Migrations for 'profiles': 0001_initial.py: - Create model RoadmapProfile
当我运行“迁移configuration文件”时:
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
我做错了什么?
听起来像你最初的迁移是伪造的,因为表已经存在(可能是一个过时的模式):
https://docs.djangoproject.com/en/1.7/topics/migrations/#adding-migrations-to-apps
现在,当你运行迁移时, Django会检测到你有一个初始的迁移,并且它想创build的表已经存在,并且将迁移标记为已经被应用 。
否则,你会得到一个没有这样的表错误:)
你是否清理了应用程序迁移表? 这也是非应用迁移的常见原因。
- 在MySQL数据库中,从表
'django_migrations'
删除行'profiles'
'django_migrations'
。 - 删除迁移文件夹中的所有迁移文件。
- 再试一次
python manage.py makemigrations
和python manage.py migrate
命令。
我是一个Django新手,我正在经历同样的问题。 这些答案对我不起作用。 我想分享一下如何解决这个问题,可能会节省很多时间。
情况:我对模型进行了更改,我想将这些更改应用到数据库。
我做了什么:在shell上运行:
python manage.py makemigrations app-name python manage.py migrate app-name
发生了什么:
-
数据库中没有更改
-
但是,当我检查数据库模式,它仍然是旧的
原因:
- 当我运行python
manage.py migrate app-name
,Django检查数据库中的django_migrations表以查看哪些迁移已经被应用,并跳过这些迁移。
– > 我试过了:从该表delete from django_migrations where app = "app-name"
app =“my-app-name”的logging( delete from django_migrations where app = "app-name"
)。 清除我的迁移文件夹并运行python manage.py makemigration my-app-name
,然后python manage.py migrate my-app-name
。 这是最被投票答案的build议。 但是这也行不通。
为什么? 因为有一个现有的表,我创build的是“初始迁移”,所以Django决定初始迁移已经被应用(因为它认为表已经存在)。 问题是现有的表有不同的模式。
解决scheme1:删除现有表(使用旧模式),进行初始迁移,然后再次应用。 这将工作(它对我来说),因为我们有一个“初始迁移”,并没有在我们的数据库同名的表。 (小提示:我用python manage migrate my-app-name zero
来快速删除db中的表)
问题? 您可能想要将数据保留在现有的表中。 你不想丢掉它们,并丢失所有的数据。
解决scheme2:
- 使用与现有表相同的模式创build初始迁移,步骤如下:
1.1。 修改您的models.py以与数据库中的当前表匹配
1.2。 删除“迁移”中的所有文件
1.3。 运行python manage.py makemigrations your-app-name
-
在django_migrations中删除所有的字段与django_migrations.app =您的应用程序的名称如何做到这一点取决于您使用哪个数据库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
这对我有用。 我设法保留了现有的数据。
更多的想法:我经历了所有这些麻烦的原因是我删除了某些应用程序/迁移/(迁移文件)中的文件。 因此,这些迁移文件和我的数据库是不一致的。 所以我会尝试不修改这些迁移文件,除非我真的知道我在做什么。
1-运行python manage.py makemigrations <appname>
2-运行python manage.py sqlmigrate <appname> <migrationname>
– 您将在appname下的迁移文件夹中findmigrationname(当然,不包含“.py”扩展名)
3-复制结果的所有文本#所有生成的sql命令
4-转到您的数据库ide并粘贴为新的查询并运行它
现在所有的更改都应用在你的数据库上
就我而言,我是这样写的:
python manage.py makemigrations
–empty yourappname
python manage.py migrate yourappname
要么:
Django跟踪django_migrations表中所有应用的迁移。 因此,只需删除django_migrations表中与您相关的所有行,如:
DELETE FROM django_migrations WHERE app='
your-app-name '
然后做:
python manage.py makemigrations
python manage.py migrate
我的问题是,在迁移相同的文件夹中没有__init__.py
文件。 将__init__.py
添加到包含它们的文件夹中,find并运行manage.py migrate
。
python manage.py migrate --fake APPNAME zero
这会使你的移植成为假货。 现在您可以运行迁移脚本
python manage.py migrate APPNAME
表将被创build,你解决了你的问题..干杯!