2014-07-25 3 views
8

데이터베이스에 연결을 추가 할 수 있습니까? 사용시 선택 쿼리 만 허용됩니까? 이 같은Django에서 읽기 전용 MySQL 데이터베이스 연결 만들기

뭔가 좋은 것 : 나는 간단한 아무것도 찾지 못했습니다

DATABASES = { 
    #can do update, insert, etc... 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'USER': 'root', 
     'PASSWORD': '12345', 
    } 
    #select only 
    'default_readonly': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'mydb', 
     'PASSWORD': '12345', 
     'READONLY': True, 

    } 
} 

.

답변

5

내가 아는 한, 장고는 데이터베이스 연결을 "읽기 전용"모드로 제한하는 옵션을 제공하지 않습니다. 그러나 MySQL 데이터베이스 엔진에 읽기 전용 사용자를 생성하여이를 수행 할 수 있습니다.

Django 코드 측면에서 또 다른 아이디어는 execute 또는 executemany이 호출되면 예외를 throw하는 자체 커서를 만드는 것입니다. this module django-db-readonly을 볼 수 있습니다.

5

'루트'대신 연결에 사용되는 사용자에 대한 사용 권한을 설정해야합니다.

이 (https://docs.djangoproject.com/en/dev/topics/db/multi-db/) 삽입/갱신/쿼리가 서로 다른 데이터베이스에 '경로'쿼리에 라우터 클래스를 지정할 수 있습니다 장고 1.2에서 당신이 (필요에) 당신이보기

+1

감사합니다 돈! 그러나 내가 장고 (그리고 따라서 힘내 안에) 내게 유지 Maxime 솔루션을 선호 – YardenST

3

에서 관리해야 오류를 인상 삭제됩니다 .

읽기에 대해 하나의 DB를 사용하고 쓰기위한 하나의이 같은 라우터 클래스를 정의 할 수 있습니다 :

Class MyRouter(object): 
    def db_for_read(self, model, **hints): 
     return 'default_readonly' 

    def db_for_write(self, model, **hints): 
     return 'default' 

    def allow_syncdb(self, db, model): 
     return db == 'default' 

을 그리고 당신의 settings.py에

DATABASE_ROUTERS = ['path.to.MyRouter'] 

이 나를 위해 노력하고 이것을 배치 내가 select_for_update()를 사용하지 않는 한, 읽기 작업으로 간주되지만 데이터베이스에 대한 쓰기 액세스가 필요합니다. 지금까지 발견 한 유일한 해결책은 비슷한 방식으로 Manager 클래스의 select_for_update를 재정의하는 것입니다.

class MyManager(Manager): 

    def select_for_update(self, *args, **kwargs): 
     return super(MyManager, self).using('default').select_for_update(*args, **kwargs) 
+0

사실 select_for_update 문제는 장고 1.7 select_for_update 쓰기 작업을 고려하여 해결됩니다 통지. – Oberix