python - Django में, मैं इनिशियलाइज़ेशन स्क्रिप्ट से subcommand 'syncdb' को कैसे कहूँ?




in-memory-database django-syncdb (4)

मैं अजगर और django के लिए नया हूं, और Django बुक का पालन ​​करते समय मैंने कमांड 'python manage.py syncdb' के बारे में सीखा जो मेरे लिए डेटाबेस टेबल उत्पन्न करता था। विकास के वातावरण में मैं मेमोरी डेटाबेस में साइक्लाइट का उपयोग करता हूं, इसलिए सर्वर को पुनरारंभ करने के बाद यह स्वचालित रूप से मिटा दिया जाता है। तो मैं इस 'syncdb' कमांड को कैसे स्क्रिप्ट करूं? (क्या इसे 'settings.py' फ़ाइल के अंदर किया जाना चाहिए?)

स्पष्टीकरण

ओपी इन-मेमोरी डेटाबेस का उपयोग कर रहा है, जिसे उस डेटाबेस के विरुद्ध परिभाषित Django मॉडल के साथ काम करने की किसी भी प्रक्रिया की शुरुआत में आरंभ करने की आवश्यकता है। यह सुनिश्चित करने का सबसे अच्छा तरीका क्या है कि डेटाबेस आरंभीकृत है (एक बार प्रक्रिया शुरू होने के बाद)। यह परीक्षण चलाने या सर्वर को चलाने के लिए होगा, या तो manage.py runserver माध्यम से या वेबसर्वर प्रक्रिया के माध्यम से (जैसे कि WSGI या mod_python के साथ)।


@ डैनियल नाब का उत्तर, साथ ही आधिकारिक साइट में डॉक्टर, प्रबंधन आदेशों को एक प्रविष्टि के रूप में निष्पादित करने के लिए नहीं है।

जब आप प्रबंधित क्लाउड वातावरण में प्रविष्टि बिंदु के रूप में AWS लैम्ब्डा या Google क्लाउड फ़ंक्शंस जैसे एंट्रीपॉइंट का उपयोग करना चाहते हैं, तो आप प्रबंध थ्योरी पर एक नज़र डाल सकते हैं और कुछ इसी तरह की कोशिश कर सकते हैं।

import os
from django.core.management import execute_from_command_line

def publishing_fn(data, context):
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'YOURAPP.settings')
    # The first argument is "manage.py" when it's run from CLI.
    # It can be an empty string in this case
    execute_from_command_line(['', 'COMMAND', 'ARGS...'])

आप एक नई स्क्रिप्ट बना सकते हैं जिसे आप प्रबंधित करने के बजाय कॉल करते हैं जो कि प्रबंधित करता है।

from subprocess import call
call(["python", "manage.py", "syncdb"])
call(["python", "manage.py", "runserver"])

यदि आपको एक व्यवस्थापक जोड़ने की आवश्यकता नहीं है तो आप दूसरी पंक्ति को इस तरह बदल सकते हैं:

call(["python", "manage.py", "syncdb", "--noinput"])

मैं मान रहा हूं कि आप जो करने की कोशिश कर रहे हैं वह आपका db बना रहा है और फिर हर बार एक आदेश के साथ अपना सर्वर शुरू करें।


सभी Django प्रबंधन आदेशों को प्रोग्रामेटिक रूप से एक्सेस किया जा सकता है :

from django.core.management import call_command
call_command('syncdb', interactive=True)

आदर्श रूप से आप इसे सक्रिय करने के लिए runserver - runserver पर प्री- runserver सिग्नल का उपयोग करेंगे, लेकिन ऐसा कोई सिग्नल मौजूद नहीं है । इसलिए, वास्तव में, जिस तरह से मैं इसे संभालता हूं यदि आप थे तो आप एक कस्टम प्रबंधन कमांड बना सकते हैं, जैसे runserver_newdb , और इसके अंदर इसे निष्पादित करें:

from django.core.management import call_command
call_command('syncdb', interactive=True)
call_command('runserver')

कस्टम प्रबंधन कमांड लिखने के बारे में अधिक जानकारी के लिए दस्तावेज़ देखें।


अद्यतन करें

मैंने प्रोजेक्ट की रूट डायरेक्टरी में run.sh नामक स्क्रिप्ट जोड़ी। यह मेरे लिए एक SQLite डेटाबेस के साथ काम किया:

#!/usr/bin/python
from django.core.management import call_command
call_command('syncdb')
call_command('runserver')

मूल उत्तर

मुझे यकीन नहीं है कि मैं समझता हूं कि "सिंकबॉक्स कमांड को स्क्रिप्ट करने" से आपका क्या मतलब है। आप आमतौर पर python manage.py syncdb को कमांड लाइन से निष्पादित करते हैं। यह आमतौर पर नए मॉडल को जोड़ने के बाद किया जाता है। मामले में आप एक सरल खोल स्क्रिप्ट का उपयोग करके आसानी से इसे पूरा करना चाहते हैं। मुझे settings.py भीतर से syncdb को रखने (या आह्वान) करने का कोई कारण नहीं दिखता है।

क्या आप अपने प्रश्न में अधिक विवरण जोड़ सकते हैं? संदर्भ जोड़ें और बताएं कि आप वास्तव में क्या करने की कोशिश कर रहे हैं?





django-syncdb