【问题标题】:How do I pipe a model query into the Django Shell via a Bash Script?如何通过 Bash 脚本将模型查询传递到 Django Shell?
【发布时间】:2017-01-04 21:08:15
【问题描述】:

我正在编写一个在创建 docker 容器时运行的 startup.sh 脚本。

#!/bin/bash
python manage.py runserver
python manage.py makemigrations accounts
python manage.py migrate
python manage.py check_permissions    
python manage.py cities --import=country --force

*python manage.py shell | from cities.models import * Country.objects.all().exclude(name='United States").delete()*

python manage.py cities --import=cities
python manage.py cities --import=postal_code

我猜有问题的行不正确,在 bash 脚本中执行此操作的正确方法是什么?

【问题讨论】:

  • 也欢迎任何关于更好方法的建议
  • 为了更好地了解管道在 bash 中的工作方式——foo | barfoo 的标准输出连接到bar 的标准输入。因此,您提出的命令将python manage.py shell 的输出发送到名为from 的命令的输入,其第二个参数cities.models 等。
  • 你也许可以用另一种方式做到这一点:printf '%s\n' 'from cities.models import *' 'Country.objects.all().exclude(name="United States").delete()' | python manage.py shell——这样你发送printf命令的输出,该命令将你的脚本生成为输入到manage.py shell命令。

标签: python django bash shell


【解决方案1】:

使用heredoc:

python manage.py shell <<'EOF'
from cities.models import *
Country.objects.all().exclude(name='United States').delete()
EOF

【讨论】:

  • 我要试试这个。
【解决方案2】:

在 shell 脚本文件中包含 django 代码并不是一个好主意。最好是制作一个 python 文件并将这些代码放入其中并执行:

python manage.py shell < script.py

或者更好,写一个django management command。通过这种方式,您可以在同一个项目/存储库中跟踪您的代码,并且人们在看到这一点时不会感到困惑。

【讨论】:

  • 为管理命令建议点赞。我实际上认为我更喜欢管理命令方法或heredoc 方法而不是python manage.py shell &lt;script.py——在后一种情况下,你有一个script.py,除非以非常特定的方式调用,否则它不会运行,而heredoc 或管理命令是在使它们的调用显而易见的上下文中提供的。
猜你喜欢
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
  • 2015-12-20
  • 2016-08-16
  • 2021-09-04
  • 1970-01-01
相关资源
最近更新 更多