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

时间:2014-07-25 07:11:30

标签: 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,

    }
}

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

4 个答案:

答案 0 :(得分:5)

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

Django代码方面的另一个想法是创建自己的游标,如果调用executeexecutemany则抛出异常。您可以查看this module django-db-readonly

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

从Django 1.2开始,你可以指定一个路由器类来路由'路由'查询到不同的数据库(https://docs.djangoproject.com/en/dev/topics/db/multi-db/)。

要使用一个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)

答案 3 :(得分:0)

一种可能的解决方案是在Django的connection_created信号中创建连接时使事务只读。

有关PostgreSQL的示例,请参阅https://stackoverflow.com/a/49753667/15690