2010-02-18 33 views
15

如何完全重置我的Django(1.2 alpha)數據庫(刪除所有表,而不是隻是清除它們)?完整的django數據庫重置

manage.py flush確實太少(如果存在架構更改,將不會工作)並且manage.py reset要求我指定所有應用程序(並且顯示的格式與「」.join(INSTALLED_APPS)不同)。我明顯可以用數據庫特定的方式實現這一點,但我認爲必須有一個理智的,DB後端不可知的方式才能做到這一點。

[編輯:我在找東西,我可以從腳本調用,例如一個Makefile和繼續,如果我改變後端數據庫或添加到settings.INSTALLED_APPS]

回答

16

This Snippet爲您提供了一個manage.py reset_db命令,您可以安裝代碼,它是解決您的問題


認爲最小的變化,從下面的評論:

你還不如干脆安裝Django命令擴展以獲得 reset_db和其他好東西: https://github.com/django-extensions/django-extensions

+7

您可能只需安裝Django命令擴展即可獲得reset_db和其他好吃的東西:http://code.google.com/p/django-command-extensions/ – 2010-02-18 20:15:20

+0

這看起來很有希望! – jathanism 2010-02-18 20:17:37

+0

太棒了 - 這看起來正是我需要的! – 2010-02-18 23:24:35

1

你想sqlreset工作:

% python manage.py help sqlreset 
Usage: manage.py sqlreset [options] <appname appname ...> 

Prints the DROP TABLE SQL, then the CREATE TABLE SQL, for the given app name(s). 

Options: 
    -v VERBOSITY, --verbosity=VERBOSITY 
         Verbosity level; 0=minimal output, 1=normal output, 
         2=all output 
    --settings=SETTINGS The Python path to a settings module, e.g. 
         "myproject.settings.main". If this isn't provided, the 
         DJANGO_SETTINGS_MODULE environment variable will be 
         used. 
    --pythonpath=PYTHONPATH 
         A directory to add to the Python path, e.g. 
         "/home/djangoprojects/myproject". 
    --traceback   Print traceback on exception 
    --version    show program's version number and exit 
    -h, --help   show this help message and exit 

就像當你修改模型,Django將不會自動爲你做這個。它只會輸出用於複製和粘貼的命令。

+0

'manage.py reset'我上面提到的只是'sqlreset'的一個包裝,所以完全相同的問題適用:我不想手動列出所有的應用程序名稱。我想要一個可以自動化的解決方案,如果我在'settings.py'中添加'INSTALLED_APPS',它將繼續工作。 – 2010-02-18 15:07:25

+0

然後你必須推出你自己的腳本。我不認爲這個功能是按原樣存在的。 – jathanism 2010-02-18 20:14:49

0

只需分配一個新的數據庫並從數據庫控制檯中刪除此數據庫。對我來說似乎是最簡單的。

+0

對不起,我應該明確說明我需要一些可以自動化的東西。 – 2010-02-18 15:11:21

+0

@as:數據庫如何丟失不可自動化?你的數據庫是什麼?寫一個SQL腳本到'DROP DATABASE x;'並運行它。 – 2010-02-18 15:24:33

-1

查看django代碼中的reset命令,並編寫自己的首先刪除/創建數據庫的命令。

0

嗯,也許你騙manage.py,假裝讓燈具,但只有尋找應用:

應用= $(蟒蛇manage.py makefixture 2> & 1 | egrep的-v「 (^ Error |^django)'| awk -F。'{print $ 2}'| uniq);對於我在$ apps中;做python manage.py sqlreset $我;做| grep DROP

爲您的項目的所有應用程序表打印出DROP TABLE語句的列表,不包括django表本身。如果你想包括它們,刪除|^django模式egrep。

但是如何提供正確的數據庫後端? sed/awk通過settings.conf?或者更好的方法是使用一些settings.conf-讀取python腳本本身。

0

假設你是(幸運的)在Linux環境以及:

  • 使用MySQL和了解用戶/密碼訪問項目的分貝
  • 慶典,MySQL和的readlink安裝
  • settings.py是設置。PY
  • dbname是一樣的Django項目名稱(見MYAPP下面 VAR)
  • 所有的應用程序要重置在INSTALLED_APPS被列爲具有完全合格的模塊名稱的字符串(從你的Django的名字項目)

將當前文件夾更改爲manage.py和settings.py所在的項目代碼。然後運行以下命令:

MYAPP=$(basename $(dirname `readlink -m settings.py`));DJANGOAPPS=$(echo 'import settings; print " ".join([ str(app).lstrip("'${MYAPP}'.") for app in settings.INSTALLED_APPS if "'${MYAPP}'" in app ])' | python -); python manage.py sqlreset $DJANGOAPPS | mysql -u root --password ${MYAPP} 

如果你明白是怎麼回事在這個慶典oneliner - 它不應該是建立在這種想法的問題(例如把它的Makefile)。

+0

請注意,echo'DROP DATABASE dbx;' |由S.Lott提出的mysql dbx也適用於unix命令行的世界。然後你只需要調用syncdb – 2012-09-10 23:03:29