python - 对于某些迁移,为什么 `sqlmigrate` 显示为空,或者双向显示相同的 SQL?
问题描述
我正在升级一个遗留项目,目前仍在 Python 2.7.18 作为升级到 3 之前的最高 Python-2。在将 Django 从 1.8.13 升级到 1.11.29 后,该项目需要一些数据库更改(未应用的迁移) ,并且我正在使用命令python manage.py sqlmigrate
来查看 SQL 语句。
我有一些问题,任何意见将不胜感激:
- 一些迁移,例如
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;
- 对于迁移
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;
顺便说一句,这个问题是对上一个问题的跟进。
解决方案
模型更改时需要 Django 迁移,但并非所有模型更改都需要 SQL 更改。
0002_logentry_remove_auto_add
迁移会更改字段的default
和editable
值action_time
。无需更改 SQL 架构。代码中有一条注释来确认这一点。
我认为0002_auto_20160226_1747
迁移就是为了这种变化。看起来根本不需要 SQL 更改,但出于某种原因,Django 正在两个方向上删除和添加相同的约束。
在大型数据库上,添加约束可能会导致锁定,因此您可能会考虑伪造该迁移而不是运行它。不过要小心,它很容易被--fake
错误地使用,并使您的迁移和数据库不同步。理想情况下,您将在开发环境中测试运行迁移,然后决定是否可以运行migrate
,或者您是否需要更复杂的计划。
推荐阅读
- typescript - 即使类型“足够相同”,也要在 TypeScript 中强制执行类型层次结构
- wso2 - API 节流是如何实现的?
- java - 是否有用于在 Java 中编码本地时间的类?
- python - 如何在阅读多列时使用 np.where
- java - Optaplanner 不使用其他 BinAvailabilty 来获取分配给事件
- python - 有什么方法可以读取从 Python 网站发送到 Chrome 的 Web 推送通知?
- powershell - 从映射的网络驱动器检索文件时出错
- ruby - 远程服务器不接受密码,ruby 脚本 'net/ssh'
- android - 在片段内单击按钮更改片段
- java - Java 正则表达式匹配\n