web-dev-qa-db-ja.com

Djangoでは、初期化スクリプトからサブコマンド「syncdb」をどのように呼び出すのですか?

私はpythonとDjangoを初めて使用しました。そして Django Book をフォローすると、データベーステーブルを生成するコマンド 'python manage.py syncdb'について学びました。開発環境ではメモリデータベースでsqliteを使用しているため、サーバーを再起動するたびに自動的に消去されます。この「syncdb」コマンドのスクリプトを作成するにはどうすればよいですか(「settings.py」ファイル内で実行する必要がありますか?)

[〜#〜]説明[〜#〜]

OPはインメモリデータベースを使用しています。これは、そのデータベースに対して定義されているDjangoモデルで動作するプロセスの開始時に初期化する必要があります。データベースを確認する最良の方法は何ですか。初期化済み(プロセスの開始ごとに1回)これは、テストの実行、またはmanage.py runserverまたはWebサーバープロセス(WSGIやmod_pythonなど)を介したサーバーの実行用です。

46

すべてDjango管理コマンド プログラムからアクセス可能

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

理想的には、runserverでpre-init信号を使用してこれをアクティブにしますが、このような信号は 存在しない です。したがって、実際に私がこれを処理する方法は、runserver_newdbのようなカスタム管理コマンドを作成し、その中で実行することです。

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

カスタム管理コマンドの記述の詳細については、 ドキュメント を参照してください。

78
Daniel Naab

" Where to put Django startup code? "で示唆されているように、ミドルウェアをスタートアップコードに使用できます。Django docs ここ です。

例(未テスト):

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
 )
9
Sam Dolan

更新

プロジェクトのルートディレクトリにrun.shというスクリプトを追加しました。これはSQLiteデータベースで私のために働きました:

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

元の回答

「syncdbコマンドをスクリプト化する」という意味が理解できません。通常、コマンドラインからpython manage.py syncdbを実行します。これは通常、新しいモデルを追加した後に行われます。簡単なシェルスクリプトを使用してこれを簡単に実現したい場合。 settings.py内にsyncdbを配置する(または呼び出す)理由がありません。

質問に詳細を追加できますか?コンテキストを追加し、何を成し遂げようとしているのか正確に説明してください。

5
Manoj Govindan

Manage.pyを呼び出すmanage.pyの代わりに呼び出す新しいスクリプトを作成できます。

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

管理者を追加する必要がない場合は、次のように2行目を変更できます。

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

私はあなたがしようとしていることはあなたのdbを作成し、毎回1つのコマンドでサーバーを起動することであると想定しています。

0
jfenwick

@Daniel Naabの回答と公式サイトのドキュメントは、エントリーポイントとして管理コマンドを実行するためのものではありません。

AWS LambdaやGoogle Cloud Functionsなどのマネージドクラウド環境のエントリポイントとして管理コマンドを使用する場合は、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...'])
0
neuront