用Django写项目,遇到临时需要处理数据库的问题时,会考虑直接让脚本在项目环境中运行,这样就可以直接用定义好的模型和方法了。
这里提供几种方法,通过Django执行指定的脚本,让脚本直接在Django项目的环境中来运行。
Django Shell
Django自带的shell其实就加载了项目的各种环境变量,网上描述得也很多,直接这么跑就可以了:
1
| python manage.py shell < script.py
|
简单是非常简单,不足的地方就是不好加参数进去,而且喜欢写main的话也不好让脚本跑起来。
自定义Command
也可以通过自定义一个简单的command来实现需要的效果,以下是最近写的一个示例,可支持执行指定的脚本文件,同时还能加入更多的脚本执行参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| """ @author:knktc @contact:me@knktc.com """
import os import sys import argparse from django.core.management.base import BaseCommand
class Command(BaseCommand): help = 'Run script in current project environment'
def add_arguments(self, parser): parser.add_argument('script', type=str, nargs=argparse.REMAINDER, help='script file path and args')
def handle(self, *args, **options): args = options['script'] script_path = args[0]
if not os.path.isfile(script_path): self.stderr.write(f'No such file: [{script_path}]') sys.exit(1)
sys_argv = [script_path] + args[1:] sys.argv = sys_argv
with open(script_path, 'r') as f: exec(f.read(), {'__name__': '__main__'})
|
把这段代码放到任意app的management/commands目录下,命名为run_script.py即可,此后就可以一劳永逸地使用这个自定义的命令了。
此后,运行指定的脚本可参考以下的命令:
1
| python manage.py run_script your_script arg1 arg2 -v arg3
|
Django extensions
此外还可以通过django-extensions这个包内置的runscript来实现,这个方法可参考文档:https://django-extensions-zh.readthedocs.io/zh_CN/latest/runscript.html