Django Migration未应用迁移更改

max*_*max 12 django

使用django 1.7.7我想使用django的迁移来添加或删除字段.所以我修改了model.py并运行了

python manage.py makemigrations myproj
Migrations for 'myproj':
  0001_initial.py:
    - Create model Interp
    - Create model InterpVersion

python manage.py migrate myproj
Operations to perform:
  Apply all migrations: myproj
Running migrations:
  Applying myproj.0001_initial... FAKED

python manage.py runserver
Run Code Online (Sandbox Code Playgroud)

然后检查管理页面,它没有更新.然后我尝试删除迁移文件夹并再次尝试; migrate命令表示没有要应用的迁移.

我该如何进行迁移?注意:我想使用django迁移的新技术而不是旧的南方法.

sth*_*hzg 19

删除迁移目录永远不是一个好主意,因为Django然后失去了已经应用了哪些迁移以及哪些迁移不被追踪(并且一旦某个应用程序被部署到某处,就很难让事情恢复同步).

免责声明:无论何时发生这种情况,最好备份数据库,如果它包含任何有价值的东西.如果在早期开发中没有必要,但是一旦后端的事情变得不同步,事情就有可能变得更糟.:-)


要恢复,您可以尝试重置模型,使其与添加/删除字段之前完全匹配.然后你就可以跑了

$ python manage.py makemigrations myproj
Run Code Online (Sandbox Code Playgroud)

这将导致初始迁移(0001_initial...).然后你可以告诉Django伪造那个迁移,这意味着告诉它设置它的内部计数器0001_initial:

使用Django 1.7:

$ python manage.py migrate myproj
Run Code Online (Sandbox Code Playgroud)

使用Django> = 1.8:

$ python manage.py migrate myproj --fake-initial
Run Code Online (Sandbox Code Playgroud)

现在,尝试更改模型并makemigrations再次运行.它现在应该创建一个0002_foobar可以按预期运行的迁移.


Cir*_*四事件 14

确保该migrations/文件夹包含__init__.py文件

失去了半个小时.

  • 这确实节省了我半个小时 (3认同)

Gau*_*wal 11

上述大多数解决方案都有助于解决该问题,但是,我想指出另一种可能(尽管很少见)的可能性,即allow_migrate数据库路由器的方法可能会False在应该返回时返回None

\n

Django 有一个设置DATABASE_ROUTERS,用于确定执行数据库查询时使用哪个数据库。

\n

来自文档:

\n
\n

如果您想实现更有趣的数据库分配行为,您可以定义并安装自己的数据库路由器。

\n
\n

数据库路由器类最多实现四种方法:

\n
    \n
  • db_for_read(模型,**提示)
  • \n
  • db_for_write(模型,**提示)
  • \n
  • 允许关系(obj1,obj2,**提示)
  • \n
  • allow_migrate(db, app_label, model_name=None, **提示)
  • \n
\n

文档中:

\n
\n

allow_migrate(db, app_label, model_name=None, **提示)

\n

确定是否允许在别名为 db 的数据库上运行迁移操作。如果操作应该运行,则返回 True;如果不应运行,则返回 False;如果路由器没有意见,则返回 None。

\n
\n

对于您尝试运行的迁移,序列中的数据库路由器之一可能会返回False ,在这种情况下,特定操作将不会运行。

\n


小智 6

在我的例子中,迁移没有反映在mysql数据库中.我从mysql数据库中的'django_migrations'表中手动删除了'myapp'行(在你的'myproj'中)并再次运行相同的命令进行迁移.

  • 想投票并让人们知道这解决了我的问题!如果没有其他问题,请记住它。 (2认同)

And*_*w E 6

我发现 Django 迁移有点神秘,并且倾向于更喜欢外部工具(例如 liquibase)。

但是,我也遇到了“没有要应用的迁移”问题。我也尝试删除该migrations文件夹,但这没有帮助。

如果您已经删除了该migrations文件夹,这里有一个对我有用的方法。

首先,生成新的“干净”迁移:

$ python manage.py makemigrations foo
Migrations for 'foo':
  dashboard/foo/migrations/0001_initial.py
    - Create model Foo
    - Create model Bar
Run Code Online (Sandbox Code Playgroud)

然后查看SQL,看看是否合理:

$ python manage.py sqlmigrate foo 0001
BEGIN;
--
-- Create model Foo
--
CREATE TABLE "foo" ("id" serial NOT NULL PRIMARY KEY, ... "created_at" timestamp with time zone NOT NULL, "updated_at" timestamp with time zone NOT NULL);
CREATE INDEX "..." ON "foo" (...);
COMMIT;
Run Code Online (Sandbox Code Playgroud)

然后应用在数据库上执行相同的 SQL。

我使用的是 Postgres,但其他引擎也类似。

一种方法是将内容写入文件:

$ python manage.py sqlmigrate foo 0001 > foo.sql
$ psql dbname username < foo.sql
BEGIN
CREATE TABLE
CREATE INDEX
COMMIT
Run Code Online (Sandbox Code Playgroud)

另一种是直接通过管道传输 SQL:

$ python manage.py sqlmigrate foo 0001 | psql dbname username
Run Code Online (Sandbox Code Playgroud)

或者复制粘贴等。