在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_更新视为写入操作来解决的。