在Django中创建只读MySQL数据库连接

Yar*_*nST 8 mysql django django-database

是否可以添加到数据库的连接,因此在使用它时只允许选择查询?

像这样的东西会很棒:

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,

    }
}
Run Code Online (Sandbox Code Playgroud)

我没有发现任何简单的事情.

Max*_*ant 6

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

在Django代码方面,另一个想法是创建自己的游标,如果execute或被executemany调用则抛出异常.你可以看一下这个模块django-db-readonly.


Don*_*Don 5

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

这会导致插入/更新/删除查询引发错误,您应该在视图中管理(在需要时)


Obe*_*rix 5

从 Django 1.2 开始,您可以指定 Router 类来将查询“路由”到不同的数据库(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'
Run Code Online (Sandbox Code Playgroud)

并将其放入您的settings.py

DATABASE_ROUTERS = ['path.to.MyRouter']
Run Code Online (Sandbox Code Playgroud)

只要我不使用 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)
Run Code Online (Sandbox Code Playgroud)