我希望自动化python manage.py makemigrations
,如果用户遇到Did you rename game.last to game.las (a CharField)? [y/N]
,则输入将始终为y
,但如果用户遇到You are trying to add a non-nullable field 'las' to game without a default
,则会自动生成1
继续输入yes | python manage.py makemigrations
。
我尝试Please select a valid option
进行了研究但是,如果要求默认输入,这只会引发mvn -B build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.incrementalVersion}
的无限循环
我的愿望是在我的第一段中提到的 1和y值之间的自动化,或者如果我在默认输入 上输入了错误的选项,则只会抛出错误
答案 0 :(得分:0)
我实际上通过timeouts
解决了问题,例如timeout 30 yes | python manage.py makemigrations
,所以如果在非可空字段输入上通过错误选项选择的无限循环返回。它将在30秒后自动退出。给我一个替代方案,以便在不推动我的迁移的情况下继续我的CI / CD
答案 1 :(得分:0)
首先,在本地运行manage.py makemigrations
。它制作了一个脚本来修改数据库模式,这是开发的一部分,并将其放置在project/migrations
目录中。构建容器,以使生成的迁移包含在您的Docker容器中(它们应该是自动的,因为它们是Django项目源树的一部分),并在容器启动时运行manage.py migrate --noinput
。它将自动应用所有尚未应用的迁移。您的迁移会随着时间而积累,但是如果确实需要,可以压缩它们,我建议您在极少数情况下不建议这样做。
这样,您将使开发和生产数据库架构保持同步,并且不会遇到奇怪的错误,因为您在开发环境中生成了生产中不存在的新迁移。
我建议您有目的地设计您的迁移,这样它们就不需要在manage.py migrate
上进行任何输入。这并非总是可能的,例如,过时的模型有时会需要输入,并且除非手动删除,否则就留在那里。
由于您可以使用所有Django源代码,因此制作一个将y假定为y的迁移命令并将其放置为管理命令很简单。然后运行该管理命令,而不要迁移。
我将显示一个示例,但它特定于您正在运行的Django版本。