是否可以添加到数据库的连接,因此在使用它时只允许选择查询?
这样的事情会很棒:
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,
}
}
我没有发现任何简单的事情。
答案 0 :(得分:5)
据我所知,Django没有提供任何选项来将数据库连接限制为“只读”模式。但是,您可以通过在MySQL数据库引擎中创建只读用户来完成此操作。
Django代码方面的另一个想法是创建自己的游标,如果调用execute
或executemany
则抛出异常。您可以查看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。