나는 이상한 동작 인 syncdb
을 가지고 있으며 과거에 작동했음을 알고 있습니다. 지난 번 내가 syncdb
을 실행 한 이후로 내 모델을 변경했지만 변경 사항은 거의 없었으며 주로 모델에 열을 추가했습니다. syncdb
은 아직 존재하지 않기 때문에 테이블 생성에 실패합니다. 나는 이유를 정말로 이해할 수 없다.manage.py syncdb가 없기 때문에 테이블을 만들 수 없습니다.
내 django 프로젝트에는 두 개의 패키지가 있습니다. remusdb
이라고하는 첫 번째 패키지는 데이터베이스 통신을 위해 django.db.models.Model
을 사용하는 독립형 응용 프로그램입니다. 내 remusdb
패키지를 사용하는 응용 프로그램을 위해 나는 아이디어는이 응용 프로그램이 사용자 정의 이름으로 데이터베이스를 결정할 수 있다는 것입니다
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'
)
처럼 보이는 샘플
settings.py
파일을 작성하고 한 당신은 장고 projetc에서
remusdb
을 포함하는 경우 기본 데이터베이스에
remusdb
- 데이터베이스를 만들어야 데이터베이스를 혼합 할 필요가 없습니다. 따라서
remusdb.models
에서 모델을 사용할 때마다 읽기 및 쓰기 액세스를 위해 자동으로
REMUSDB_DB_ID
을 사용하는 데이터베이스 라우터를 작성했습니다.
이것은 독립 실행 형 응용 프로그램으로 훌륭하게 작동하며 별다른 문제가 없습니다. 심지어는 에서 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
데이터베이스와 혼합하고 싶지 않은 자체 데이터베이스가있는 내 장고 프로젝트 내에 remusdb
을 사용하고 싶습니다. 나는 내 위의 샘플에 따라 settings.py
파일의 변경했습니다 그것은 다음과 같습니다
createdb remusdbdev
를 만든 장고 프로젝트의 종속성으로
remusdb
을 추가 한 후
python manage.py syncdb --database=remusdb
와 테이블을 실행
... 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'
)
...
in 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
의 포인트는 테이블을 생성한다는 것입니다 존재하지 않습니다. 재미있는 점은 dtango의 설정으로 remusdb_syncdb
(내 독립형 응용 프로그램에서)을 실행하면 (라인을 임시로 제거해야 함) syncdb
은 테이블을 만듭니다. 그 후 python manage.py syncdb
은 더 이상 실패하지 않습니다.
여기에 뭔가가 있습니까? 과거에 manage.py syncdb --database=remusdb
을 실행할 수 있었던 이유는 무엇입니까? 이제이 이상한 오류가 발생합니다.
제출하기 전에 내 질문을 읽으면서 처음부터 어떻게 장고 프로젝트를 시작했는지 생각했습니다. django 프로젝트를 만들고 remusdb
이 작동하는 데 필요한 settings.py
의 변경 사항을 추가했습니다.다음 나는 처음으로 syncdb
을 실행했습니다. 이제 뷰와 템플릿이있는 두 번째 패키지 monitor
이 있습니다. 그래서 데이터베이스를 한 번 더 삭제하고 다시 만들고 이번에는 'monitor'
라인을 INSTALLED_APPS
에서 임시로 삭제했습니다. 그런 다음 python manage.py syncdb --database=remusdb
을 실행했으며 문제없이 실행됩니다. 다음 번에이 단계를 반복했지만 'monitor'
행을 일시적으로 제거하지 않았고 오류가 반환되었습니다.
여기에 무슨 일이 일어나고 있습니까?
Syncdb 테이블을 변경 지원하지 않습니다. 당신은 그것을 실현하기 위해 남쪽이라고 불리는 제 3의 앱을 조사해야한다. – karthikr
나는 그것을 알고있다. 그러나 여기의 문제는 테이블을 변경하는 것이 아니라 그것을 전혀 만들지 않는 것이다. 'INSTALLED'APPS'의'monitor' 줄을 제거하면 갑자기 작동합니다. 이유를 이해할 수 없습니다. – Pablo
INSTALLED_APPS에서 remusdb를 사용하면 문제가 발생합니까? –