2012-10-05 5 views
2

나는 이상한 동작 인 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, shellsqlall과 같은 명령을 실행하는 작은 스크립트를 만들었습니다.

#!/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 remusdbdevpython 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' 행을 일시적으로 제거하지 않았고 오류가 반환되었습니다.

여기에 무슨 일이 일어나고 있습니까?

+0

Syncdb 테이블을 변경 지원하지 않습니다. 당신은 그것을 실현하기 위해 남쪽이라고 불리는 제 3의 앱을 조사해야한다. – karthikr

+0

나는 그것을 알고있다. 그러나 여기의 문제는 테이블을 변경하는 것이 아니라 그것을 전혀 만들지 않는 것이다. 'INSTALLED'APPS'의'monitor' 줄을 제거하면 갑자기 작동합니다. 이유를 이해할 수 없습니다. – Pablo

+0

INSTALLED_APPS에서 remusdb를 사용하면 문제가 발생합니까? –

답변

0

나는 'remusdb' 위의 'monitor' 위를 INSTALLED_APPS으로 옮겨야한다고 생각합니다. 문제를 해결할 수 있습니다.

INSTALLED_APPS = (
     ... 
     'monitor', 
     'remusdb' 
    ) 
관련 문제