2013-01-10 3 views
14

내 Django 프로젝트에는 알려진 스키마가있는 다양한 디렉토리에 SQLite 캐시 파일을 생성하는 타사 응용 프로그램에 대한 종속성이 있습니다.Django : 동적 데이터베이스 파일

Django 모델을 사용하여 데이터베이스에 액세스하고 싶지만 정적으로 DATABASES 설정을 사용할 수 없습니다.

임의 경로에서 SQLite 데이터베이스를 어떻게 동적으로 열 수 있습니까?

바이런 루스 지적 편집

용액은 검색어 세트의 using 기능과 연계 django.db.connections을 사용하는 것이다.

+0

왜 데이터베이스를 사용할 수없는 이유는 무엇입니까? 내가 왜 이것을 보았는지 장고의 저자가 만든 이유! 또 다른 옵션은 원시 SQL (http://docs.python.org/2/library/sqlite3.html)을 사용하는 것입니다. 그러나 다소 프레임 워크의 목적을 무력화시킵니다! – StefanNch

+0

@StefanNch : 내가 데이터베이스를 동적으로 추가했기 때문에 어떤 데이터베이스를 사용할 지 알 수 없기 때문에'데이터베이스 설정 '을 사용할 수 없습니다. 그리고 예, 저는 현재 sqlite3 API를 사용하고 있습니다.이 API는 SQL을 파고 드는 것을 원치 않으므로 완전히 만족하지 않습니다. – Constantinius

+0

흥미로운 건축물 이잖아요.하지만 이제는 당신의 문제를 봅니다 ... – StefanNch

답변

29

django.db.connections 주위 DATABASES에 정의 된 간단한 래퍼 당신의 설정. 래퍼 클래스는 여기에 있습니다 : django.db.utils#L137-L227

from django.db import connections 

# Add connection information dynamically.. 
connections.databases['new-alias'] = { ... } 
# Ensure the remaining default connection information is defined. 
# EDIT: this is actually performed for you in the wrapper class __getitem__ 
# method.. although it may be good to do it when being initially setup to 
# prevent runtime errors later. 
# connections.databases.ensure_defaults('new-alias') 

# Use the new connection 
conn = connections['new-alias'] 
+1

나는 이것이 내가 찾고있는 해결책이라고 생각합니다. 나는 그것을 시도 할 것이다! – Constantinius

+0

이것은 데이터베이스 파일을 동적으로 선택하고 열어 내 모델을 사용할 수있었습니다. (그러나 이것은 queryset에서'using' 함수를 필요로합니다). – Constantinius

+0

멋지다! 흠 ... 그래서이 연결은 DB를 사용해야하는 각 들어오는 요청에 대해 추가해야합니까? 요청을받을 때 db를 설정하기 위해 일부 미들웨어에서이를 감싸는 것이 좋을 수도 있습니다 ... – monkut

4

DATABASES 설정에서 데이터베이스를 등록 할 수 있습니다.

from your_project import settings 
database_id = "unqique_name" 
new_database = {} 
new_database["id"] = database_id 
new_database['ENGINE'] = 'django.db.backends.sqlite3' 
new_database['NAME'] = '/project/data/db_%s.sql' % database_id 
new_database['USER'] = '' 
new_database['PASSWORD'] = '' 
new_database['HOST'] = '' 
new_database['PORT'] = '' 
settings.DATABASES[database_id] = new_database 

하지만 그렇게해서는 안됩니다. 사용 된 유일한 엔진을 가정

+0

이것은 재미있어 보입니다. 하지만 나는'DATABASES' 설정을 변경할 필요가없는 해결책을 선호합니다. – Constantinius

+1

런타임에 응용 프로그램의 설정을 변경하면 안됩니다. 예를 들어,보기에서 이것을하지 마십시오. https://docs.djangoproject.com/en/dev/topics/settings/#altering-settings-at-runtime –

2

SQLite는하고 (전용) 데이터베이스 파일의 위치가 달라집니다 무엇의 NAME에 호출을 제공 할 수 있습니다 :

def get_db_loc(): 
    # code to determine filesystem location of database 
    return location 

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': get_db_loc(), 
     # More config goes here 
    } 
} 
+0

나는 이것을 두 번째로합니다. 런타임 중에 DB 위치가 동적으로 변경되면 get_db_loc()이 현재 활성화 된 DB (텍스트 파일/전역 var에 해당 정보 저장)를 기반으로 동작을 변경하고 get_db_loc() 내부에서 실시간으로 현재 활성 DB. –

+1

'get_db_loc' 함수는 한번만 평가되고'DATABASES'가 읽혀질 때마다 평가되는 것이 아니기 때문에 이것이 작동하는지 확신 할 수 없습니다. 그렇지 않으면 기여에 감사드립니다. – Constantinius

+0

맞아, 이것이 작동 할 수있는 방법이 없습니다. 'get_db_loc()'의 결과는 단순한 문자열입니다. 함수를 호출하여 얻은 사실에 대해서는 특별한 것이 없으며 그 함수를 다시 호출 할 필요는 없습니다. – rspeer