首页 > 解决方案 > 对于某些迁移,为什么 `sqlmigrate` 显示为空,或者双向显示相同的 SQL?

问题描述

我正在升级一个遗留项目,目前仍在 Python 2.7.18 作为升级到 3 之前的最高 Python-2。在将 Django 从 1.8.13 升级到 1.11.29 后,该项目需要一些数据库更改(未应用的迁移) ,并且我正在使用命令python manage.py sqlmigrate来查看 SQL 语句。

我有一些问题,任何意见将不胜感激:

  1. 一些迁移,例如0002_logentry_remove_auto_add下面,SQL 只包含注释,我想知道为什么。
(venv) [user@server app]$ python manage.py sqlmigrate             admin      0002_logentry_remove_auto_add
BEGIN;
--
-- Alter field action_time on logentry
--
COMMIT;
  1. 对于迁移0002_auto_20160226_1747,SQL 对于向前和向后(--backwards)方向都是相同的,我也想知道 1)为什么,以及 2)这是否应该是一个问题。只是想谨慎使用生产数据库,并感谢您的指点。
(venv) [user@server app]$ python manage.py sqlmigrate             authtoken  0002_auto_20160226_1747
BEGIN;
--
-- Change Meta options on token
--
--
-- Alter field created on token
--
--
-- Alter field key on token
--
--
-- Alter field user on token
--
ALTER TABLE `authtoken_token` DROP FOREIGN KEY `authtoken_token_user_id_535fb363_fk_auth_user_id`;
ALTER TABLE `authtoken_token` ADD CONSTRAINT `authtoken_token_user_id_35299eff_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`);
COMMIT;

(venv) [user@server app]$ python manage.py sqlmigrate --backwards authtoken  0002_auto_20160226_1747
BEGIN;
--
-- Alter field user on token
--
ALTER TABLE `authtoken_token` DROP FOREIGN KEY `authtoken_token_user_id_535fb363_fk_auth_user_id`;
ALTER TABLE `authtoken_token` ADD CONSTRAINT `authtoken_token_user_id_35299eff_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`);
--
-- Alter field key on token
--
--
-- Alter field created on token
--
--
-- Change Meta options on token
--
COMMIT;

顺便说一句,这个问题是对上一个问题的跟进。

标签: pythonmysqldjangomigration

解决方案


模型更改时需要 Django 迁移,但并非所有模型更改都需要 SQL 更改。

0002_logentry_remove_auto_add迁移会更改字段的defaulteditableaction_time。无需更改 SQL 架构。代码中有一条注释来确认这一点。

我认为0002_auto_20160226_1747迁移就是为了这种变化。看起来根本不需要 SQL 更改,但出于某种原因,Django 正在两个方向上删除和添加相同的约束。

在大型数据库上,添加约束可能会导致锁定,因此您可能会考虑伪造该迁移而不是运行它。不过要小心,它很容易被--fake错误地使用,并使您的迁移和数据库不同步。理想情况下,您将在开发环境中测试运行迁移,然后决定是否可以运行migrate,或者您是否需要更复杂的计划。


推荐阅读