2011-10-28 10 views
10

मैं दो django प्रतिष्ठानों (उत्पादन और परीक्षण) के बीच डेटा सिंक करने की कोशिश कर रहा हूं। मैं उत्पादन पर ./manage.py dumpdata --natural का उपयोग कर कर रहा हूं, फिर ./manage.py loaddata परीक्षण पर ताज़ा syncdb 'एड डेटाबेस में।Django: प्रत्येक तालिका से सभी डेटा हटाएं (लेकिन टेबल को स्वयं रखें)

सब कुछ ठीक काम कर रहा था जब तक कि मैंने एक नई कस्टम अनुमति नहीं दी। उत्पादन syncdb ने खाली डेटाबेस पर एक नए syncdb की तुलना में इस नई अनुमति को एक अलग क्रम (विभिन्न प्राथमिक कुंजी के साथ) में लोड किया। नतीजतन, यह एक अलग आईडी हो जाता है। तो प्राकृतिक कुंजी, जब मैं डेटा लोड करने का प्रयास उपयोग करने के बावजूद, मैं इस त्रुटि मिल रही है जब पहली बाहर के आदेश अनुमति वस्तु भरी हुई है:

IntegrityError: duplicate key value violates unique constraint "auth_permission_content_type_id_codename_key" 

सबसे आसान तरीका मैं इसे ठीक करने के बारे में सोच सकते परीक्षण स्थापना में प्रत्येक तालिका से सभी डेटा को निकालना है - यानी, तालिका बनाने के लिए syncdb का उपयोग करने के लिए, और प्रारंभिक डेटा भी लोड नहीं करना है। लेकिन syncdb आपको आरंभिक डेटा/सिग्नल चरण को छोड़ने नहीं देता है। प्रत्येक मॉडल या टेबल नाम को स्पष्ट रूप से समझाते हुए, syncdb पर कॉल करने के बाद मैं सभी प्रारंभिक डेटा को कैसे हटा सकता हूं? या syncdb का उपयोग किए बिना खाली टेबल बनाने का कोई तरीका है?

./manage.py flush वह नहीं है जो मैं बाद में हूं - यह प्रारंभिक डेटा को पुनः लोड करता है और सिंकडब सिग्नल ट्रिगर करता है।

उत्तर

9

फ्लश आदेश (मैं Django 1.3.1 का उपयोग कर रहा) एसक्यूएल कि निष्पादित किया जाता है एक ही एसक्यूएल ./manage.py sqlflush से प्राप्त है, और फिर प्रारंभिक डेटा जुड़नार पुनर्स्थापित किया जाता है के लिए मदद के अनुसार।

$ python manage.py help flush 
Usage: manage.py flush [options] 

Executes ``sqlflush`` on the current database. 

एक ही डेटा पोंछते क्षमताओं प्राप्त करने के लिए शून्य से स्थिरता लोड हो रहा है आप का उपयोग कर ./manage.py sqlflush फोन करके एसक्यूएल प्राप्त और फिर निष्पादित कर सकते हैं कि SQL Django के मनमाने ढंग से क्रियान्वित करने के लिए एसक्यूएल में निर्मित समर्थन:

from django.core.management import call_command, setup_environ 
from your_django_project import settings 
setup_environ(settings) 

from django.db import connection 
from StringIO import StringIO 

def main(): 
    # 'call' manage.py flush and capture its outputted sql 
    command_output = StringIO() 
    call_command("sqlflush", stdout=command_output) 

    command_output.seek(0) 
    flush_sql = command_output.read() 

    # execute the sql 
    # from: https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly 
    cursor = connection.cursor() 
    cursor.execute(flush_sql) 

    print "db has been reset" 

if __name__ == '__main__': 
    main() 

यह अतिरिक्त लाभ है कि आप निष्पादन से पहले ./manage.py sqlflush से एसक्यूएल को संशोधित करने से पहले संशोधित कर सकते हैं ताकि आप बरकरार रहना चाहें।

इसके अलावा, the current Django docs के अनुसार, Django 1.5 में एक नया पैरामीटर ./manage.py flush --no-initial-data डेटा रीसेट करेगा और प्रारंभिक डेटा स्थिरता लोड नहीं करेगा।

0

Django < = 1.4 के लिए, आप reset प्रबंधन आदेश का उपयोग कर सकते हैं।

./manage.py sqlreset myapp1 myapp2 
+1

रीसेट को बहिष्कृत किया गया है, क्योंकि आपके द्वारा लिखे गए दस्तावेज़ों का उल्लेख है; लेकिन इसके लिए आपको प्रत्येक ऐप की गणना करने की आवश्यकता है, जिसे मैं टालना चाहता हूं। फ्लश इसका प्रतिस्थापन है; लेकिन यह प्रारंभिक डेटा लोड करता है। – user85461

+0

बहिष्कृत इसका मतलब यह नहीं है कि आप इसका उपयोग नहीं कर सकते हैं। यदि आप ऐप नामों की गणना नहीं करना चाहते हैं, तो मुझे लगता है कि आपको अपना प्रबंधन कमांड लिखना होगा। – Alasdair

+0

इसे 1.5 में हटा दिया गया है। दुर्भाग्य से ऐसा लगता है कि एक ऐप को फ्लश करने का कोई तरीका नहीं है :( – Andre

संबंधित मुद्दे