2010-04-13 8 views
5

मैं सिंकडब को मेरे द्वारा परिभाषित SQL क्वेरी (तालिका निर्माण के लिए) निष्पादित कैसे करूं, बल्कि फिर तालिकाएं स्वचालित रूप से उत्पन्न कर सकता हूं।Django में, सिंकडब चलाए जाने पर SQL फ़ाइल से टेबल बनाने के लिए कैसे करें

मैं इस समाधान की तलाश में हूं क्योंकि मेरे ऐप में कुछ विशेष मॉडल विरासत-डेटाबेस तालिका के लिए SQL-table-views का प्रतिनिधित्व करते हैं। इसलिए, मैंने अपने डीजेंगो-डीबी में अपने एसक्यूएल-व्यू बनाए हैं:

legacy_series को चुनें * legacy.series से चुनें;

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

मैं ऊपर उल्लिखित एसक्यूएल को सिंकडीबी कैसे चला सकता हूं?

उत्तर

5

वहाँ 2 संभव दृष्टिकोण मैं एक विरासत डेटाबेस तालिका में अपना मॉडल अनुकूल करने के लिए के बारे में पता (विचारों का उपयोग यह है कि बिना) कर रहे हैं:

1) अपनी परियोजना के भीतर चलाने के लिए अजगर manage.py inspectdb। यह मौजूदा डेटाबेस टेबल के लिए मॉडल उत्पन्न करेगा, फिर आप उन लोगों के साथ काम करना जारी रख सकते हैं।

2) कुछ विशिष्ट सेटिंग्स के साथ अपनी तालिकाओं को संशोधित करें। सबसे पहले आप अपने मेटा विकल्पों में db_table विकल्प सेट करके अपने मॉडल में तालिका का नाम परिभाषित करते हैं। दूसरी बात यह है कि आप db_column विकल्प को सेट करके अपने विरासत डेटाबेस से मिलान करने के लिए प्रत्येक फ़ील्ड कॉलम नाम के लिए परिभाषित करते हैं। ध्यान दें कि सूचीबद्ध अन्य डीबी_ विकल्प हैं जो संभवतः आप अपने विरासत डेटाबेस से मेल खाने के लिए उपयोग कर सकते हैं।

यदि आप वास्तव में विचारों को एक (बदसूरत) कार्यवाही तक पहुंचना चाहते हैं, तो आप custom sql commands प्रति एप्लिकेशन मॉडल को परिभाषित कर सकते हैं। यह फ़ाइल "एप्लिकेशन"/एसक्यूएल/"मॉडल"। एसक्यूएल में पाई जाती है। सभी टेबल बनाने के बाद Django इस एसक्यूएल को कॉल करेगा। आप जेनरेटेड टेबल के लिए डीआरओपी कथन निर्दिष्ट करने का प्रयास कर सकते हैं, इसके बाद आपके व्यू को इस फ़ाइल में स्टेटमेंट बनाते हैं। ध्यान दें कि विदेशी कुंजी वाले तालिकाओं के लिए यह थोड़ा मुश्किल होगा क्योंकि django इन फ़ाइलों के निष्पादन का कोई आदेश नहीं देता है (इसलिए एक .sql में सभी कथन भरना सबसे आसान तरीका होगा, मैंने पहले कभी कोशिश नहीं की है)।

4

आप अपने रिवर्स-इंजीनियर मॉडल के लिए unmanaged models और initial SQL scripts का उपयोग अपने विचारों के लिए कर सकते हैं।

संपादित:

थोड़ा और अधिक विस्तृत जवाब। जब आप अप्रबंधित मॉडल का उपयोग करते हैं, तो syncdb आपके लिए डेटाबेस डेटाबेस नहीं बनाएगा, इसलिए आपको इसका ख्याल रखना होगा। तालिका का नाम एक महत्वपूर्ण बिंदु है, और कैसे django तालिका नामों के लिए Model कक्षाएं मानचित्र करता है, मेरा सुझाव है कि आप the doc on that point पढ़ लें। तब

class Series(models.Model): 
    # model fields... 
    ... 

    class Meta: 
     managed = False 
     db_table = "legacy_series" 

, आप yourapp/sql/series.sql फ़ाइल में, अपने SQL कमांड के रख सकते हैं:

मूल रूप से, अपने Series मॉडल है कि तरह दिखेगा

### yourapp/sql/series.sql 
CREATE VIEW legacy_series AS SELECT * FROM legacy.series; 

फिर आप syncdb कर सकते हैं हमेशा की तरह, और अपने विरासत मॉडल का उपयोग शुरू करें।

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