Django | 執行項目下指定的腳本

1 描述

有時候會碰到這樣的場景,對於一些業務升級,我須要把數據庫數據作些處理,同時又想以 Django 項目的環境變量執行腳本,這個時候使用 python 腳本是再適合不過的手段了。python

2 使用自帶的 shell

python manage.py shell < script

或者shell

./manage.py shell < script
2.1 舉例

圖片描述

2.2 腳本代碼以下:

# -*- coding: utf-8 -*-

from __future__ import absolute_import
from __future__ import unicode_literals

from django.contrib.auth.models import User


def show_user():
    user = User.objects.get(username='admin')
    print 'I am {0}'.format(user.username)


show_user()

2.3執行命令

python manage.py shell < script1.py數據庫

2.4 運行結果以下:

2.4.1 安裝了 ipython(這裏版本爲 4.2.0)

圖片描述

2.4.2 沒有安裝 ipython

圖片描述

3 使用 django-extensions

  • 手段1:在 app 下面創建一個 scripts 包,而後創建你的腳本django

  • 手段2:在項目目錄下面創建一個 scripts 包,而後創建你的腳本app

運行腳本命令以下:spa

python manage.py runscript script_name 

或者 

./manage.py runscript script_name

3.1 手段1

3.1.1 針對手段1

圖片描述

3.1.2 腳本以下:

# -*- coding: utf-8 -*-

from __future__ import absolute_import
from __future__ import unicode_literals

from django.contrib.auth.models import User


def run():
    user = User.objects.get(username='admin')
    print 'project_dir/cat/scripts/:I am {0}'.format(user.username)

3.1.3 運行命令

python manage.py runscript showadmin

3.1.4 執行結果以下

圖片描述

3.2 手段2

3.2.1 針對手段 2

圖片描述

3.2.2 腳本以下:

# -*- coding: utf-8 -*-

from __future__ import absolute_import
from __future__ import unicode_literals

from django.contrib.auth.models import User


def run():
    user = User.objects.get(username='admin')
    print 'project_dir/scripts/:I am {0}'.format(user.username)

3.2.3 運行命令

./manage.py runscript showadmin

3.2.4 執行結果

圖片描述

3.3 注意

runscript 命令會首先檢查每一個 app 下的 scripts 目錄,若是找到對應名字的腳本就會執行.而後檢查 project_dir/scripts 目錄下是否包含符合名字的腳本,若是找到也會執行.也就是說,咱們能夠在不一樣的 app 中建立相同名字的腳本,而且都會被執行.code

圖片描述

此時有兩個 showadmin.py 文件orm

  • djtest/cat/scripts/showadmin.pyblog

  • djtest/scripts/showadmin.py圖片

運行結果以下:

圖片描述

4 使用自定義命令

這個自行參照文檔

5 使用 migrations

示例以下:

from django.db import migrations

from apps.xx.scripts.xx import run


class Migration(migrations.Migration):
    initial = True

    dependencies = [
        ('thirdservice', '0007_auto_20160909_1021'),
    ]

    operations = [
        migrations.RunPython(run),
    ]

run 方法中封裝業務邏輯,這樣更爲方便一些

相關文章
相關標籤/搜索