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

在Django中创建只读MySQL数据库连接,mysql,django,django-database,Mysql,Django,Django Database,是否可以将连接添加到数据库,以便在使用它时只允许选择查询 像这样的东西会很棒: DATABASES = { #can do update, insert, etc... 'default': { 'ENGINE': 'django.db.backends.mysql', 'USER': 'root', 'PASSWORD': '12345', } #select only 'default_readonly

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

像这样的东西会很棒:

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,

    }
}

我没有发现任何简单的东西。

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


在Django代码方面,另一个想法是创建自己的游标,如果调用
execute
executemany
,则会引发异常。您可以查看。

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


这会导致insert/update/delete查询引发错误,您应该在视图中管理这些错误(需要时)

在Django 1.2中,您可以指定一个路由器类将查询“路由”到不同的数据库()

要使用一个db进行读取,一个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)

一种可能的解决方案是,在Django的
connection\u created
信号中创建连接时,将事务设置为只读


有关PostgreSQL的示例,请参见。

谢谢!然而,我更喜欢Maxime解决方案,因为它让我留在Django内部(因此也在Git内部)。实际上,我注意到,在Django 1.7中,select_for_更新问题是通过将select_for_更新视为写入操作来解决的。