48

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

明確化

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

4

5 に答える 5

85

すべてのDjango管理コマンドはプログラムでアクセスできます

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

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

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

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

于 2010-08-16T18:51:27.523 に答える
11

「 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')

そしてあなたのsettings.pyで:

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

     # Existing middleware classes here
 )
于 2010-08-16T19:13:29.250 に答える
6

アップデート

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

質問に詳細を追加していただけますか?コンテキストを追加し、何をしようとしているのかを正確に説明しますか?

于 2010-08-16T18:21:37.390 に答える
0

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"])

私はあなたがやろうとしていることはあなたのデータベースを作成しそしてそれから毎回1つのコマンドであなたのサーバーを起動することであると仮定しています。

于 2010-08-16T18:23:03.400 に答える
0

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

AWSLambdaやGoogleCloudFunctionsなどのマネージドクラウド環境のエントリポイントとして管理コマンドを使用する場合は、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...'])
于 2019-02-27T00:48:10.673 に答える