使用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可以按预期运行的迁移.
Gau*_*wal 11
上述大多数解决方案都有助于解决该问题,但是,我想指出另一种可能(尽管很少见)的可能性,即allow_migrate数据库路由器的方法可能会False在应该返回时返回None。
Django 有一个设置DATABASE_ROUTERS,用于确定执行数据库查询时使用哪个数据库。
来自文档:
\n\n\n如果您想实现更有趣的数据库分配行为,您可以定义并安装自己的数据库路由器。
\n
数据库路由器类最多实现四种方法:
\n从文档中:
\n\n\nallow_migrate(db, app_label, model_name=None, **提示)
\n确定是否允许在别名为 db 的数据库上运行迁移操作。如果操作应该运行,则返回 True;如果不应运行,则返回 False;如果路由器没有意见,则返回 None。
\n
对于您尝试运行的迁移,序列中的数据库路由器之一可能会返回False ,在这种情况下,特定操作将不会运行。
\n小智 6
在我的例子中,迁移没有反映在mysql数据库中.我从mysql数据库中的'django_migrations'表中手动删除了'myapp'行(在你的'myproj'中)并再次运行相同的命令进行迁移.
我发现 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)
或者复制粘贴等。
| 归档时间: |
|
| 查看次数: |
19373 次 |
| 最近记录: |