Djangoでは、初期化スクリプトからSubcommand 'Syncdb」を呼び出すにはどうすればよいですか?
-
29-09-2019 - |
質問
私はPythonとDjangoに慣れています。 Django Book 私は、データベーステーブルを生成したコマンド「python manage.py syncdb」について学びました。開発環境では、メモリデータベースでSQLiteを使用しているため、サーバーを再起動するたびに自動的に消去されます。では、この「syncdb」コマンドをスクリプト化するにはどうすればよいですか?(settings.py」ファイル内で実行する必要がありますか?)
説明
OPは、そのデータベースに対して定義されたDjangoモデルで動作するプロセスの開始時に初期化する必要があるインメモリデータベースを使用しています。データベースが初期化されていることを確認するための最良の方法は何ですか(プロセスごとに1回)。これは、テストを実行したり、サーバーを実行したりするためのものです。 manage.py runserver
または、Webサーバープロセス(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スタートアップコードはどこに置くのですか?「、スタートアップコードにミドルウェアを使用できます。DjangoDocsは ここ.
たとえば(テストされていない):
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')
そしてあなたのsettings.pyで:
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
コマンドラインから。これは通常、新しいモデルを追加した後に行われます。シンプルなシェルスクリプトを使用して、これを簡単に達成したい場合に備えてください。配置する(または呼び出す)理由はありません syncdb
内部から settings.py
.
質問に詳細を追加できますか?コンテキストを追加して、何をしようとしているのかを正確に説明しますか?
manage.py.py:calling.pyの代わりに呼び出す新しいスクリプトを作成できます。
from subprocess import call
call(["python", "manage.py", "syncdb"])
call(["python", "manage.py", "runserver"])
管理者を追加する必要がない場合は、次のように2行目を変更できます。
call(["python", "manage.py", "syncdb", "--noinput"])
私はあなたがやろうとしていることは、あなたのDBを作成し、毎回1つのコマンドでサーバーを起動することだと仮定しています。
@Daniel Naabの答えは、公式サイトのドキュメントと同様に、管理コマンドをエントリポイントとして実行するためではありません。
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...'])