2011-04-13 2 views
0

나는 mysql 데이터베이스 # 1을 사용하여 몇 개의 애플 리케이션으로 프로젝트 (# 1)를 가지고있다. 나는 또한 django 코드가 같은 서버에있는 다른 프로젝트 (# 2)를 가지고 있지만 다른 mysql 데이터베이스 (# 2)를 사용한다.django에서 주 프로젝트 내에서 별도의 프로젝트를 어떻게 쿼리합니까?

나의 목표는 프로젝트 # 1에서 웹 응용 프로그램을 실행하고 프로젝트 # 2에서 django 모델을 사용하여 db # 2에 대한 간단한 쿼리를 작성하는 것입니다. 그러나, 프로젝트 # 2에서 가져올 때 # 2 데이터베이스를 적절하게 사용하는 # 2 settings.py 파일 (즉, # 2 프로젝트에서 웹 응용 프로그램을 실행할 때 잘 작동합니다, 여전히 # 1 데이터베이스를 사용합니다.).

다음은 독립 실행 형 스크립트로 성공적으로 실행할 수있는 파일의 전체 내용입니다. 내가 프로젝트 # 1로 파일을 가져 기능을 실행할 때 (이 테이블에 대한 DB # 1에서 찾고 있기 때문에) 슬프게도, 그것은 실패

import sys 

def get_stuff_from_project2(ids): 
    from django.core.management import setup_environ 
    from project2 import settings 
    setup_environ(settings) 

    from project2.myapp2.models import mymodel2 

    all_rows = mymodel2.objects.filter(id__in=ids).values() 
    return(all_rows) 

# as a standalone script, run the main function 
if __name__ == "__main__": 
    sys.path.append("/home/me/django") 
    print str (get_stuff_from_project2(sys.argv[1:])) 

을 다시, 이것은 독립형 스크립트로 작동합니다. 그러나, 프로젝트 # 1 (아래의 코드를 사용하여) 그것은 DatabaseError의 실패에서 테이블 'db1.myapp2_mymodel2'는 존재하지 않습니다

from project1.myapp1.standalone_script import get_stuff_from_project2 
all_rows = get_stuff_from_project2(ids) 

여기에 내 생각은 setup_environ 기능은 실제로 새로운 DATABASE_NAME을 처리하지 않는다는 것입니다 설정이 완료되면 기존 DATABASE_NAME을 (를) 변경할 수 없습니까?

저는이 시점에서 약간 분실되어 해결책을 찾고자했습니다. 필자는 프로젝트 1과 프로젝트 2를 가능한 한 분리 된 상태로 유지하고 싶기 때문에 "다중 사이트"또는 "다중 데이터베이스"접근 방식을 사용하고 싶지 않습니다. 내 대안은 독립 실행 형 스크립트를 프로젝트 1에서 시스템 호출로 호출하거나 API 인 프로젝트 2에서 뷰를 만들고 데이터를 전송하는 것입니다. 그러나 모델을 사용하는 것이 효과가 있다면 가장 단순하다고 생각했습니다.

감사합니다. 나는 하나의 독립형 스크립트에서 두 개의 서로 다른 프로젝트에 액세스 할 수 있습니다 방법 :

는 ------- 태평양 표준시 11시 35분 ----

가 여기에 문제의 간단한 버전의 4 월 13 일 추가했다. 다음 코드는 내가 처음에 setup_environ 않는 중 프로젝트에 대한 확인을 작동하지만,이 두 번째 수행 할 수 없습니다

import sys 
from django.core.management import setup_environ 
sys.path.append('/home/me/django') 

from project1 import settings 
print setup_environ(settings) # shows /home/me/django/project1 
print settings.DATABASE_NAME # shows db1 
from project1.myapp1.models import mymodel1 
mymodel1.objects.filter(id=9376544).values() # works fine 

from project2 import settings 
print setup_environ(settings) # shows /home/me/django/project2 
print settings.DATABASE_NAME # shows db2 
from project2.myapp2.models import mymodel2 
mymodel2.objects.filter(id=6544).values() # fails with: 
# django.db.utils.DatabaseError: (1146, "Table 'db1.myapp2_mymodel2' doesn't exist") 

답변

0

단일 스크립트를 사용하여이를 해결할 수 없었습니다. 나는 두 개의 스크립트를 대신 사용했다 : 첫 번째는 쉘 명령으로, 두 번째 출력은 stdout에 대한 목록으로 형식화 된 데이터를 사용했다.

이것은 다른 앱의 데이터베이스에서 하나의 데이터 스트림을 읽는 문제에 충분히 견딜 수 있지만 몇 가지 쿼리를 필요로하거나 두 번째 앱의 데이터에 쓰는 것과 같은 더 큰 문제에는 적합하지 않습니다. 좀 더 복잡한 문제를 해결하려면 API (XMLRPC, REST는 Django에서 쉽게 사용 가능)를 추가하여 실행중인 앱을 호출하십시오.

0

당신은 예를 들어, WSGI 파일 (당신의 PYTHONPATH에 다른 프로젝트를 추가해야 mod_wsgi를 사용하고 있다면, 또는 "python manage.py shell"에서 해당 프로젝트에 접근하고 싶다면 manage.py 파일에 저장하십시오. 당신이 그렇게했다면 마법처럼 작동합니다.

+0

그러나 프로젝트 # 1과 프로젝트 # 2는 이미 동일한 파이썬 경로에 있습니다 (위 코드를 편집하고 sys.path.append 문을 주 조건부로 옮겨 더 명확하게했습니다). 내 디렉토리 구조는 다음과 같습니다./home/me/django/project1 및/home/me/django/project2 및/home/me/django는 이미 파이썬 경로에 있습니다. – brfox

관련 문제