2

私は奇妙な動作をsyncdbしており、過去にそれが機能していたことを知っています. 前回の実行以降、syncdbモデルに変更を加えましたが、変更は最小限であり、主にモデルに列を追加しました。syncdbまだ存在しないため、テーブルの作成に失敗しました。なぜなのか本当に理解できません。

私の django プロジェクトには 2 つのパッケージがあります。私が呼ぶ最初のパッケージremusdbは、多かれ少なかれdjango.db.models.Model、データベースの通信に使用するスタンドアロン アプリケーションです。私のパッケージを使用するアプリケーション用に、次のようなremusdbサンプル ファイルを作成しました。settings.py

REMUSDB_DB_ID   = "remusdb"
DATABASES = {
        'default': {
            # django.db needs a "default" database
            # make django.db happy.
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME':   '/dev/null',
        },

        REMUSDB_DB_ID: {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME':   'remusdb',
            'OPTIONS': { 'autocommit': True },
        }
}
DATABASE_ROUTERS= [ "remusdb.RemusDBRouter" ]
SECRET_KEY = "Make.here.something.random"
INSTALLED_APPS = (
        'remusdb'
)

アイデアは、このアプリケーションがカスタム名でデータベースを決定できるということです。django プロジェクトに含める場合、デフォルト データベースに -databasesremusdbを作成する必要があるため、データベースを混同する必要はありません。したがって、モデルを使用するたびに読み取りおよび書き込みアクセスremusdbを自動的に使用するデータベース ルーターも作成しました。REMUSDB_DB_IDremusdb.models

これはスタンドアロン アプリケーションとしてうまく機能し、問題はありません。やmanage.pyなどからコマンドを実行する小さなスクリプトも作成しました。syncdbshellsqlall

#!/usr/bin/env python
# filename: remusdb_syncdb

import sys
import os
import re

if __name__ == "__main__":
    if len(sys.argv) != 2:
        t  = "Usage: %s settings-unix-path\n" % sys.argv[0]
        t += "\n"
        t += "settings-unix-path       The path of the settings module\n"
        t += "                         in Unix-path format.\n\n"
        t += "NOTE: DO NOT USE %s if you are using RemusDB\n" % sys.argv[0]
        t += "inside of a Django application. In this case please call\n"
        t += "python manage.py syncdb && \\\n"
        t += "    python manage.py syncdb --database=<your database name>"
        sys.exit(t)

    settings_list = sys.argv[1].split("/")
    mod_settings  = settings_list[-1]

    del settings_list[-1]
    settings_path = '/'.join(settings_list)
    if settings_path == "":
        settings_path = "."

    mod_settings = re.sub(r'\.py$', "", mod_settings)

    sys.path.append(settings_path)

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", mod_settings)
    from django.core.management import execute_from_command_line
    from django.conf import settings

    argv = [sys.argv[0], "syncdb", "--database=%s" % settings.REMUSDB_DB_ID]
    execute_from_command_line(argv)

remusdb_syncdb <path to settings>/settings.pyデータベースの呼び出しが作成され、アプリケーションを使用できるようになります。

remusdb、私は自分のデータベースと混ぜたくない独自のデータベースを持つ私のdjangoプロジェクトの中で使いたいと思っていますremusdb。上記のサンプルに従ってファイルを変更する必要があり、settings.py次のようになります。

... the usual stuff
REMUSDB_DB_ID   = "remusdb"
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'remusweb',                     # Or path to database file if using sqlite3.
    },

    REMUSDB_DB_ID: {
        'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'
        'NAME':   'remusdbdev',                             # Name of DB or path if sqlite is used as engine
        'OPTIONS': { 'autocommit': True },
    }
}
DATABASE_ROUTERS= [ "remusdb.RemusDBRouter" ]
...
INSTALLED_APPS = (
    ...
    'remusdb',
    'monitor'
)
...

remusdb最初にdjangoプロジェクトの依存関係として追加したとき、データベースを作成してcreatedb remusdbdev実行python manage.py syncdb --database=remusdbすると、テーブルremusdbdevが作成されました。

django アプリケーションを 2 か月開発した後、いくつかのテーブルに列を追加するremusdb必要があり、SQL コードを自分で実行したくありませんでした。だから私は作っdropdb remusdbdevて実行するとpython manage.py syncdb --database=remusdb、このエラーが生成されます:

  File "/home/shaoran/devpython/lib/python2.6/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 52, in execute
    return self.cursor.execute(query, args)
django.db.utils.DatabaseError: relation "remus_process" does not exist
LINE 1: ..."."last_stop", "remus_process"."last_change" FROM "remus_pro...

もちろん、まだ存在していません。ポイントはsyncdb、テーブルを作成することです。面白いことにremusdb_syncdb、django の設定で (スタンドアロン アプリから) 実行すると (一時的に のmonitor行を削除する必要がありますINSTALLED_APPS) syncdb、テーブルが作成されます。その後、python manage.py syncdbもう失敗しません。

ここで何か不足していますか?以前は実行できたのに、なぜmanage.py syncdb --database=remusdbこの奇妙なエラーが発生するのですか?


質問を送信する前に読み返しながら、そもそもどのようにして django プロジェクトを開始したかを考えました。django プロジェクトを作成し、settings.py必要な変更を加えましたremusdbそれからsyncdbは初めて実行しました。monitorこれで、ビューとテンプレートを含む 2 番目のパッケージができました。そのため、データベースをもう一度削除して、もう一度作成し、今回は一時的に'monitor'から行を削除しましたINSTALLED_APPS。その後python manage.py syncdb --database=remusdb、実行したところ問題なく動作しました。次回はこれらの手順を繰り返しましたが、行を一時的に削除しなかったため'monitor'、エラーが返されました。

ここで何が起こっているのですか?

4

1 に答える 1

0

'monitor'で上'remusdb'に移動することも試してみるとよいと思いますINSTALLED_APPS。問題が解決する場合があります。

すなわち

    INSTALLED_APPS = (
        ...
        'monitor',
        'remusdb'
    )
于 2012-11-08T03:06:22.220 に答える