2014-07-25 43 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

据我所知,Django没有提供任何选项来限制数据库连接到“只读”模式。但是,您可以通过在MySQL数据库引擎中创建只读用户来完成此操作。

在Django代码中,另一个想法是创建自己的游标,如果调用executeexecutemany,则会引发异常。你可以看看this module django-db-readonly

5

您应该为用于连接的用户设置权限(而不是'root')。

这将导致插入/更新/删除查询引发错误,你应该在你的观点(在需要)

+1

谢谢Don!但我更喜欢Maxime解决方案,因为它让我在Django内部(因此在Git中) – YardenST

3

管理从Django的1.2,你可以指定一个路由器类“路线”查询不同的数据库(https://docs.djangoproject.com/en/dev/topics/db/multi-db/) 。

要使用一个分贝读,一个用于写,你可以定义一个Router类是这样的:

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问题在Django 1.7中通过考虑select_for_update写入操作来解决。 – Oberix