私は奇妙な動作を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_ID
remusdb.models
これはスタンドアロン アプリケーションとしてうまく機能し、問題はありません。やmanage.py
などからコマンドを実行する小さなスクリプトも作成しました。syncdb
shell
sqlall
#!/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'
、エラーが返されました。
ここで何が起こっているのですか?