标签: django-migrations

django恢复上次迁移

我已经进行了迁移,添加了一个新表,并希望还原它并删除迁移,而不创建新的迁移.

我该怎么做?是否有恢复上次迁移的命令,然后我可以删除迁移文件?

django django-migrations

394
推荐指数
10
解决办法
16万
查看次数

Django 1.7 - makemigrations没有检测到变化

正如标题所说,我似乎无法让迁移工作.

该应用程序最初低于1.6,因此我了解迁移最初不会出现,事实上,如果我运行,python manage.py migrate我得到:

Operations to perform:
  Synchronize unmigrated apps: myapp
  Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
  Installing custom SQL...
  Installing indexes...
Running migrations:
  No migrations to apply.
Run Code Online (Sandbox Code Playgroud)

如果我对任何模型进行更改myapp,它仍然会按预期显示未迁移.

但如果我跑,python manage.py makemigrations myapp我得到:

No changes detected in app 'myapp'
Run Code Online (Sandbox Code Playgroud)

似乎没关系我运行命令的内容或方式,它从未检测到应用程序有更改,也没有将任何迁移文件添加到应用程序.

有没有办法迫使应用程序进行迁移,并基本上说"这是我的工作基础"或任何东西?或者我错过了什么?

我的数据库是一个PostgreSQL,如果它有帮助的话.

python django django-1.7 django-migrations

138
推荐指数
15
解决办法
10万
查看次数

用于重命名模型和关系字段的Django迁移策略

我打算在现有的Django项目中重命名几个模型,其中有许多其他模型与我想要重命名的模型有外键关系.我很确定这需要多次迁移,但我不确定具体的程序.

假设我开始在Django应用程序中使用以下模型myapp:

class Foo(models.Model):
    name = models.CharField(unique=True, max_length=32)
    description = models.TextField(null=True, blank=True)


class AnotherModel(models.Model):
    foo = models.ForeignKey(Foo)
    is_awesome = models.BooleanField()


class YetAnotherModel(models.Model):
    foo = models.ForeignKey(Foo)
    is_ridonkulous = models.BooleanField()
Run Code Online (Sandbox Code Playgroud)

我想重命名Foo模型,因为名称并没有真正意义,并且导致代码混乱,并且Bar会使名称更加清晰.

从我在Django开发文档中读到的内容,我假设以下迁移策略:

步骤1

修改models.py:

class Bar(models.Model):  # <-- changed model name
    name = models.CharField(unique=True, max_length=32)
    description = models.TextField(null=True, blank=True)


class AnotherModel(models.Model):
    foo = models.ForeignKey(Bar)  # <-- changed relation, but not field name
    is_awesome = models.BooleanField()


class YetAnotherModel(models.Model):
    foo = models.ForeignKey(Bar)  # <-- changed relation, …
Run Code Online (Sandbox Code Playgroud)

python django django-migrations

133
推荐指数
8
解决办法
6万
查看次数

在Django 1.7中运行单元测试时禁用迁移

Django 1.7引入了数据库迁移.

在Django 1.7中运行单元测试时,它会强制迁移,这需要很长时间.所以我想跳过django迁移,并在最终状态下创建数据库.

我知道忽略迁移可能是一种不好的做法,因为代码的那部分将不会被测试.但事实并非如此:我正在CI测试服务器(jenkins)中运行完整的迁移.我只想跳过本地测试中的迁移,速度很重要.


一些背景:

直到Django 1.6,当使用South时,我使用了SOUTH_TESTS_MIGRATE设置:

默认情况下,如果South的syncdb命令以非交互模式运行(包括运行测试时),它还将应用迁移 - 每次运行测试时它都会运行每次迁移.

如果您希望测试运行器使用syncdb而不是迁移 - 例如,如果您的迁移需要太长时间才能应用 - 只需在settings.py中设置SOUTH_TESTS_MIGRATE = False即可.

但是,syncdb不再存在,现在它正在迁移.

从Django 1.8我将使用--keepdb参数:

--keepdb选项可用于在测试运行之间保留测试数据库.这样做的优点是可以跳过create和destroy操作,这大大减少了运行测试的时间,特别是在大型测试套件中.如果测试数据库不存在,它将在第一次运行时创建,然后为每次后续运行保留.在运行测试套件之前,任何未应用的迁移也将应用于测试数据库.

所以这个问题仅限于Django 1.7.

django unit-testing django-migrations

106
推荐指数
4
解决办法
2万
查看次数

如何从Django 1.7中的初始迁移中迁移回来?

我用一些模型创建了一个新的应用程序,现在我注意到一些模型很难想到.由于我没有提交代码,明智的做法是将数据库迁移到最后的良好状态,并使用更好的模型重做迁移.在这种情况下,最后一个良好状态是新应用程序不存在的数据库.

如何从Django 1.7中的初始迁移中迁移回来?

South一个人可以做:

python manage.py migrate <app> zero
Run Code Online (Sandbox Code Playgroud)

<app>将从迁移历史中清除并删除所有表<app>.

如何使用Django 1.7迁移?

python django django-1.7 django-migrations

104
推荐指数
2
解决办法
4万
查看次数

Django-DB-Migrations:不能ALTER TABLE,因为它有未决的触发事件

我想从TextField中删除null = True:

-    footer=models.TextField(null=True, blank=True)
+    footer=models.TextField(blank=True, default='')
Run Code Online (Sandbox Code Playgroud)

我创建了一个模式迁移:

manage.py schemamigration fooapp --auto
Run Code Online (Sandbox Code Playgroud)

由于一些页脚列包含NULL我得到这个,error如果我运行迁移:

django.db.utils.IntegrityError:列"footer"包含空值

我将此添加到架构迁移中:

    for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
        sender.footer=''
        sender.save()
Run Code Online (Sandbox Code Playgroud)

现在我得到:

django.db.utils.DatabaseError: cannot ALTER TABLE "fooapp_emailsender" because it has pending trigger events
Run Code Online (Sandbox Code Playgroud)

怎么了?

python django postgresql django-migrations

103
推荐指数
5
解决办法
4万
查看次数

Django 1.9 - makemigrations - 未检测到任何更改

使用现有应用程序,我尝试使用makemigrations命令创建迁移,但它显示"未检测到任何更改".

通常我使用startapp命令创建新的应用程序但这个特定的应用程序不是.

经过一段时间的调试后,我发现它没有创建迁移,因为migrations应用程序中缺少包/文件夹.

如果不存在或者我错过了某些东西,它会更好地创建文件夹

python django django-migrations

101
推荐指数
14
解决办法
7万
查看次数

如何简化Django 1.7中的迁移?

南方已有类似的问题,但我已经开始使用Django 1.7进行我的项目,而不是使用South.

在开发过程中,已经创建了许多迁移,但是软件尚未完成,并且不存在必须迁移的数据库.因此,我想重置迁移,就像我当前的模型是原始模型并重新创建所有数据库一样.

建议的方法是什么?

编辑:从Django 1.8开始,有一个名为squashmigrations的新命令,它或多或少地解决了这里描述的问题.

django-1.7 django-migrations

91
推荐指数
6
解决办法
9万
查看次数

Django 1.8:为现有模式创建初始迁移

我启动了一个使用迁移系统的django 1.8项目.
在某种程度上事情变得混乱,所以我从数据库中删除了迁移文件夹和表,现在我正在尝试重建它们,但没有成功.

我有三个应用程序(3个models.py文件),模型完全反映了表格!

到目前为止我发现的最佳方法是:

  1. 删除所有migrations文件夹.完成!
  2. django_migrations表中删除所有内容.完成!
  3. python manage.py makemigrations --empty <app>为每个应用运行.完成!
  4. python manage.py migrate --fake.完成!(虽然只有在每次makemigrations命令后运行它才有效.

现在我添加一个新字段,运行该makemigrations命令,我收到以下错误:
django.db.utils.OperationalError: (1054, "Unknown column 'accounts_plan.max_item_size' in 'field list'")

我一直在烧这个东西.我怎样才能初始化迁移,这样我每次都可以继续工作而不会发生迁移中断?

为什么这么复杂?为什么没有简单的单行:initiate_migrations_from_schema

编辑:
现在事情变得更加糟糕.我截断了django_migrations表并删除了所有migrations文件夹.
现在我尝试运行python manage.py migrate --fake-initial(我在DEV文档中找到的东西),这样就设置了所有Django的"内部"应用程序(auth,session等),我得到了:
(1054, "Unknown column 'name' in 'django_content_type'").
现在,这个"专栏"不是一个真正的专栏.它是@propertyDjango contenttypes应用程序中定义的.这里发生了什么?为什么将该name属性识别为真正的列?

django django-migrations

72
推荐指数
1
解决办法
5万
查看次数

我可以在Django中使用数据库视图作为模型吗?

我想使用我在我的数据库中创建的视图作为我的django-view的源代码.

这可能,而不使用自定义SQL?

******13/02/09更新***********

像许多答案建议的那样,您可以在数据库中创建自己的视图,然后通过在models.py中定义它在API中使用它.

虽然有些警告:

  • manage.py syncdb将不再起作用
  • 视图在其名称的开头需要与所有其他模型(表格)相同的内容,例如,如果您的应用程序被称为"事物",那么您的视图将需要被称为thing_ $ viewname

django django-syncdb django-migrations

61
推荐指数
3
解决办法
3万
查看次数