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)
我没有发现任何简单的事情.
据我所知,Django没有提供任何选项来限制数据库连接到"只读"模式.但是,您可以通过在MySQL数据库引擎中创建只读用户来完成此操作.
在Django代码方面,另一个想法是创建自己的游标,如果execute或被executemany调用则抛出异常.你可以看一下这个模块django-db-readonly.
从 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)
| 归档时间: |
|
| 查看次数: |
5370 次 |
| 最近记录: |