في Django ، كيف يمكنني تسمية المفصل الفرعي "SyncDB" من البرنامج النصي للتهيئة؟

StackOverflow https://stackoverflow.com/questions/3495964

سؤال

أنا جديد على Python و Django ، وعند اتباع كتاب Django لقد تعلمت عن أمر "Python Management.py syncdb" الذي أنشأ جداول قاعدة البيانات بالنسبة لي. في بيئة التطوير ، أستخدم SQLite في قاعدة بيانات الذاكرة ، لذلك يتم محوها تلقائيًا في كل مرة أقوم فيها بإعادة تشغيل الخادم. فكيف يمكنني السيع هذا الأمر "syncdb"؟ (هل يجب أن يتم ذلك داخل ملف "Settings.py"؟)

توضيح

يستخدم OP قاعدة بيانات في الذاكرة ، والتي يجب تهيئتها في بداية أي عملية تعمل مع نماذج Django المحددة مقابل قاعدة البيانات هذه. ما هي أفضل طريقة لضمان تهيئة قاعدة البيانات (مرة واحدة في كل عملية تبدأ). سيكون هذا للاختبارات قيد التشغيل ، أو تشغيل خادم ، إما عبر manage.py runserver أو عبر عملية خادم الويب (مثل WSGI أو Mod_python).

هل كانت مفيدة؟

المحلول

جميع أوامر إدارة Django يمكن الوصول إليها برمجيا:

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

من الناحية المثالية ، يمكنك استخدام إشارة مسبقة runserver لتفعيل هذا ، ولكن مثل هذه الإشارة غير موجود. لذا ، في الواقع ، الطريقة التي سأتعامل بها مع هذا إذا كنت ستنشئ أمرًا مخصصًا للإدارة runserver_newdb, وتنفيذ هذا بداخله:

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

نرى وثائق لمزيد من المعلومات حول كتابة أوامر الإدارة المخصصة.

نصائح أخرى

كما اقترح ""أين تضع رمز بدء التشغيل Django؟"، يمكنك استخدام البرامج الوسيطة لرمز بدء التشغيل الخاص بك. مستندات Django هي هنا.

على سبيل المثال (لم يخبر):

startup.py:

from django.core.exceptions import MiddlewareNotUsed
from django.conf import settings
from django.core.management import call_command

class StartupMiddleware(object):
    def __init__(self):
        # The following db settings name is django 1.2.  django < 1.2 will use settings.DATABASE_NAME
        if settings.DATABASES['default']['NAME'] == ':memory:':
            call_command('syncdb', interactive=False)

        raise MiddlewareNotUsed('Startup complete')

وفي الإعدادات الخاصة بك.

 MIDDLEWARE_CLASSES = (
     'your_project.middleware.startup.StartupMiddleware',

     # Existing middleware classes here
 )

تحديث

أضفت نصًا يسمى run.sh في دليل الجذر للمشروع. هذا عمل بالنسبة لي مع قاعدة بيانات SQLite:

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

الإجابة الأصلية

لست متأكدًا من أنني أفهم ما تعنيه من خلال "البرمجة النصية لأمر syncdb". عادة ما تنفذ python manage.py syncdb من سطر الأوامر. يتم ذلك عادة بعد إضافة نماذج جديدة. في حال كنت تريد أن تنجز هذا بسهولة باستخدام برنامج نصي shell بسيط. لا أرى أي سبب لوضعه (أو استدعاء) syncdb من داخل settings.py.

هل يمكنك إضافة المزيد من التفاصيل إلى سؤالك؟ أضف السياق واشرح ما الذي تحاول القيام به بالضبط؟

يمكنك إنشاء برنامج نصي جديد تتصل به بدلاً من manage.py الذي يدعو إلى manage.py:

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

إذا لم تكن بحاجة إلى إضافة مسؤول ، فيمكنك تغيير السطر الثاني مثل هذا:

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

أفترض أن ما تحاول القيام به هو إنشاء DB الخاص بك ثم ابدأ خادمك بأمر واحد في كل مرة.

إجابة Daniel Naab ، وكذلك Doc في الموقع الرسمي ، ليست لتنفيذ أوامر الإدارة كنقطة دخول.

عندما ترغب في استخدام أمر الإدارة كنقطة إدخال في بيئة سحابية مُدارة مثل وظائف AWS Lambda أو Google Cloud ، يمكنك إلقاء نظرة على manage.py وجرب شيئًا مشابهًا.

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...'])
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top