簡體   English   中英

Django (1.7) - 數據遷移

[英]Django (1.7) - data migrations

我創建了一個空的數據遷移腳本,用於使用來自 JSON 文件的數據填充應用程序數據庫表之一,使用

python manage.py makemigrations --empty <app name>

我想將 JSON 文件中包含的數據添加到 db 中,該數據庫目前只包含一個表,使用數據遷移腳本(根據 Django 1.7 文檔,這是推薦的方法),使用名為populate_db的自定義方法,該方法將使用bulk_create將多個條目添加到表中,然后執行save()將更改寫入數據庫。 目前自定義方法是空的,因為我仍在處理它,但腳本現在看起來像這樣

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations

def populate_db( apps, schema_editor ):
   print ‘Populating db from JSON file...'

class Migration(migrations.Migration):

   dependencies = [
       ('<app name>', '0003_auto_20150224_2024'),
   ]

   operations = [
                          migrations.RunPython( populate_db ),
   ]

在完全運行該腳本之前,如何測試該腳本以確保自定義方法按預期工作? 我可以從解釋器中調用它並使用 db API 對其進行測試嗎?

目前如果我這樣做

python manage.py migrate <app name>

它報告沒有要應用的遷移。

您可以向后遷移:

python migrate <app name> 0003

然后再次運行您的遷移:

python migrate <app name>

更新:要使數據遷移可逆,請添加reverse_code參數:

def depopulate_db(apps, schema_editor):
    print 'Deleting previously added data from db...'

class Migration(migrations.Migration):
    ...
    operations = [
        migrations.RunPython(populate_db, depopulate_db),
    ]

好的,我找到了一個有效的解決方案:手動刪除migrations數據庫表中的條目以進行我想要撤消的遷移,然后使用python manage.py migrate <migration>再次運行python manage.py migrate <migration>

也許不是推薦的方法,但它似乎有效,因為顯示了我在遷移文件中作為自定義方法的填充符添加的測試輸出。

也許 Django 人可以考慮在manage.py添加一個undo_migrate選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM