2009-11-09 12 views
16

मैं Django में एक डेटाबेस पुनर्स्थापित करने के लिए कोशिश कर रहा हूँ की रीसेट कर सकते हैं नहीं, का उपयोग करते हुए:डाटाबेस मुसीबत: क्योंकि निर्भरता

python manage.py reset app 

लेकिन प्राप्त निम्न त्रुटि:

Error: Error: app couldn't be reset. Possible reasons: 
    * The database isn't running or isn't configured correctly. 
    * At least one of the database tables doesn't exist. 
    * The SQL was invalid. 
Hint: Look at the output of 'django-admin.py sqlreset app'. That's the SQL this command wasn't able to run. 
The full error: cannot drop table app_record because other objects depend on it 
HINT: Use DROP ... CASCADE to drop the dependent objects too. 

यह वह जगह है क्या मेरी models.py फ़ाइल लगता है:

class Record(models.Model): 
    name = models.CharField(max_length=50, db_index=True) 
    year = models.IntegerField(blank=True, null=True) 
    def __unicode__(self): 
     return self.name 

class Class(models.Model): 
    record = models.ForeignKey(Record) 
    def __unicode__(self): 
     return self.id 

मुझे लगता है कि मैं ड्रॉप ... एसक्यूएल कि हट जाता है और आरईसी में CASCADE आदेश का उपयोग करने की जरूरत है पाने के डेटाबेस (django-admin.py का आउटपुट) को रीसेट करता है।

लेकिन मैं सीधे SQL.py से उस SQL ​​को कैसे संपादित कर सकता हूं?


अद्यतन

ठीक है, मैं समझ कैसे, मैन्युअल रूप से तालिकाओं को हटाने के लिए (डेटाबेस postgres है) इसे यहाँ एक ही समस्या के साथ किसी के लिए भी उल्लेख किया है:

python manage.py dbshell 
# drop table app_record cascade; 
# \q 
python manage.py reset app 

चाहेंगे अभी भी यह जानना पसंद है कि किसी के पास ऐसा करने का बेहतर तरीका है, हालांकि :)

+0

आप इसे पाने के लिए क्या कमांड टाइप कर रहे हैं? 'python manage.py रीसेट ऐप '? या आप विशेष तालिका को रीसेट करने की कोशिश कर रहे हैं? –

+0

क्षमा करें - हाँ, "python manage.py रीसेट ऐप"। – Richard

+1

एक साधारण समाधान केवल डीआरओपी का उपयोग करने के लिए होगा ... CASCADE आदेश मैन्युअल रूप से, फिर डेटाबेस को पुन: बनाएँ ... क्या कोई मुझे ऐसा करने का उदाहरण दे सकता है? – Richard

उत्तर

4

आसान तरीका पूरी तरह से एक Django डेटाबेस पुनर्स्थापित करने के लिए django-extensions उपयोग कर रहा है।

इसमें reset_db कमांड है जो सभी Django के डिफ़ॉल्ट डेटाबेस बैकएंड का समर्थन करता है।

python manage.py reset_db 

यदि आप Django 1.2+ का उपयोग कर रहे हैं तो आपको स्पष्ट रूप से उस डेटाबेस को परिभाषित करना चाहिए जिसे आप रीसेट करना चाहते हैं। यदि आपकी प्रोजेक्ट केवल एक डेटाबेस का उपयोग करती है, तो आपको शायद --router=default

+0

दरअसल यह भी एक हुकोकू साझा डेटाबेस पर काम नहीं करता है (इस तरह मैं इस समस्या पर कैसे आया)। – Alper

+2

प्रश्न विशेष रूप से एक ऐप को रीसेट करने के लिए कहता है, न कि संपूर्ण डेटाबेस। यह मेरी राय में एक अच्छा जवाब नहीं है। –

2

ड्रॉप टेबल कैस्केड की समस्या यह है कि यह सिर्फ एक को हटा दें संबंधित तालिकाओं पर शासन कुंजी - सिंकडब के बाद यह संबंध पुनर्निर्मित नहीं होता है। मैं विशेष मॉडल के टेबल से बनाने के लिए कोई रास्ता मिल गया, तो मैं पुनः स्कीमा द्वारा पूरे आवेदन reseting हूँ:

DROP SCHEMA public CASCADE; 
    CREATE SCHEMA "public" AUTHORIZATION "owner of database"; 

यह केवल डेटाबेस के साथ काम करना चाहिए स्कीमा का समर्थन करता है कि, उदाहरण के लिए postgresql

4

मैं एक छोटी यूनिक्स पाइपलाइन का उपयोग करता हूं जो सभी डीआरओपी विवरणों में कैस्केड जोड़ता है।

python manage.py sqlreset myapp | sed 's/DROP TABLE \(.*\);/DROP TABLE \1 CASCADE;/g' | \ 
psql --username myusername mydbname 
+1

यह शानदार है। एक अतिरिक्त के रूप में, कोई 'psql - उपयोगकर्ता नाम myusername mydbname' के बजाय 'manage.py dbshell' का उपयोग कर सकता है। –

1

अन्य उत्तरों में विवरण का उपयोग करके, मैंने एक बैश फ़ंक्शन बनाया जिसे मैंने ~/.bash_profile (मैक ओएस एक्स पर) में गिरा दिया।

django_reset() { python mainsite/manage.py sqlreset "$*" | sed 's/DROP TABLE \(.*\);/DROP TABLE \1 CASCADE;/g' | mainsite/manage.py dbshell ; } 

फिर इस रूट को टर्मिनल में अपनी रूट कोड निर्देशिका से चलाएं (इसलिए mainsite/manage.py के पथ को समझ में आता है)।

django_reset myappA myappB 

और यह निष्पादित होगा!

0

मुझे एक और तरीका मिला। मैं sqlite3 का उपयोग कर रहा हूं जो डिफ़ॉल्ट रूप से Django में आता है। डिफ़ॉल्ट रूप से तालिका को रीसेट करने के लिए। पायथन प्रबंधन।py flush --database = default इसके बाद आपको syncdb कमांड का फिर से उपयोग करने की आवश्यकता होगी।

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