django 项目中使用多数据库 multiple databases
假如在一个django项目中使用到了不只一个数据库, 其实这在大一点的工程中很常见,比如主从库
那么会涉及到如下一些东西
1, 定义
在settings中的DATABASE中定义会使用到的数据,比如除default外我们还定义了一个 search
DATABASE = {
'default':{
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'path/to/database.sqllite3',
'USER':'',
'PASSWORD':'',
'HOST': '',
'PORT':'',
},
'search':{
'ENGINE': 'django.db.backends.mysql',
'NAME': 'search_db',
'USER':'db_user',
'PASSWORD':'p@55word',
'HOST': '192.168.12.186',
'PORT':'',
}
}
2, 使用
会产生数据库操作的几个地方
- Model对象
- QuerySet
- manager
假如有Model对象 obj
它的save()会执行 INSERT 或 UPDATE
它的 delete() 会执行 DELETE
我们拿到一个obj,或者创建一个新的obj后,使用非default db时, 参数中传进using
obj = Person(name='wy', uid=530)
obj.save(using='search')
obj.delete(using='search')
通过manager拿到的都是QuerySet, 它对应数据库中的一个集合, 对应的语句是 SELECT
QuerySet有using方法, 指定去SELECT的数据库, 而QuerySet有一组方法是返回QuerySet对象的,所以只要在这个调用链中使用 using 就行
Person.objects.all().using('search').filter(uid__gt=100)
而manager本身提供了一个方法using, 这么定义的
def using(self, *args, **kwargs):
return self.get_queryset().using(*args, **kwargs)
所以上面那行代码等效于
Person.objects.using('search').filter(uid__gt=100)
有时候我们会在manager层面设置使用的数据库. 比如对自定义的manager.
自定义的manager常见的一个情况是重写get_queryset()方法, 比如一个lady_manager,它可以重写get_queryset()只返回所有lady,然后再在这个基础上filter...
其实manager返回的QuerySet的_db是manager自己的_db传过去的, 而manager有 db_manager()这个方法来设置自身的_db
def db_manager(self, using):
obj = copy.copy(self)
obj._db = using
return obj
所以只要这么用就好, 假如Person有一个自定义manager ladies
Person.ladies.db_manager('search').all()
3, admin使用多数据库
admin是django自带的一个app,那它涉及的是,读一个Model的所有对象(读一张表SELECT), 增加,删除,那么重写admin.ModelAdmin的如下几个做这几件事方法就好了
class MultiDBModelAdmin(admin.ModelAdmin):
# A handy constant for the name of the alternate database.
using = 'other' def save_model(self, request, obj, form, change):
# Tell Django to save objects to the 'other' database.
obj.save(using=self.using) def delete_model(self, request, obj):
# Tell Django to delete objects from the 'other' database
obj.delete(using=self.using) def get_queryset(self, request):
# Tell Django to look for objects on the 'other' database.
return super(MultiDBModelAdmin, self).get_queryset(request).using(self.using) def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
# Tell Django to populate ForeignKey widgets using a query
# on the 'other' database.
return super(MultiDBModelAdmin, self).formfield_for_foreignkey(db_field, request=request, using=self.using, **kwargs) def formfield_for_manytomany(self, db_field, request=None, **kwargs):
# Tell Django to populate ManyToMany widgets using a query
# on the 'other' database.
return super(MultiDBModelAdmin, self).formfield_for_manytomany(db_field, request=request, using=self.using, **kwargs)
如上代码摘自django文档,关于 formfield_for_foreignkey 和 formfield_for_manytomany 还没细研究
把上面的类定义放到自己的代码中,然后自己的ModelAdmin从它派生就行了, using中指定要使用的数据库, 如
class PersonAdmin(MultiDBAdmin):
pass
admin.site.register(PersonAdmin, Person)
-----------------------
参考:
https://docs.djangoproject.com/en/1.6/topics/db/multi-db/
django 项目中使用多数据库 multiple databases的更多相关文章
- Django项目连接多个数据库配置
1.设置数据库连接 pip install PyMySQL 2.在项目同名目录myproject/myproject下的__init__.py添加以下代码 import pymysql pymysql ...
- 【技术博客】JWT的认证机制Django项目中应用
开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. JWT的认证机制Django项目中应用 这篇技术博客基于软 ...
- celery 分布式异步任务框架(celery简单使用、celery多任务结构、celery定时任务、celery计划任务、celery在Django项目中使用Python脚本调用Django环境)
一.celery简介: Celery 是一个强大的 分布式任务队列 的 异步处理框架,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行.我们通常使用它来实现异步任务(async tas ...
- 在项目中使用SQLite数据库小结
------------------------------------------------------------------------推荐: - VS2012 使用 1.0.84 版的库 - ...
- [翻译]在Django项目中添加谷歌统计(Google Analytics)
原文:<Google Analytics tracking code into Django projects, the easy way> 对我来说,制作一个可扩展的Django应用随时 ...
- Django项目中使用Redis
Django项目中使用Redis DjangoRedis 1 redis Redis 是一个 key-value 存储系统,常用于缓存的存储.django-redis 基于 BSD 许可, 是一个使 ...
- 在Xamarin.iOS项目中使用预设数据库
在Xamarin.iOS项目中使用预设数据库 当开发者准备好一个预设数据库文件后,就可以将这个数据库文件添加到创建的项目中了.本节将分别在Xamarin.iOS和Xamarin.Android项目中使 ...
- 擦他丫的,今天在Django项目中引用静态文件jQuery.js 就是引入报错,终于找到原因了!
擦 ,今天在Django项目中引用静态文件jQuery.js 就是引入报错,终于找到原因了! 问题在于我使用的谷歌浏览器,默认使用了缓存,导致每次访问同一个url时,都返回的是缓存里面的东西.通过谷歌 ...
- django 项目中的 favicon.ico 处理
django 项目中的 favicon.ico 处理 (django == 2.0.6) 1. 引入模块: from django.views.generic.base import Redirec ...
随机推荐
- ZOJ 3983 - Crusaders Quest - [DFS]
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3983 题意: 给出一个长度为 $9$ 的字符串 $s$,且 $s ...
- PAT-GPLT L1-033 - 出生年 - [简单模拟]
题目链接:https://www.patest.cn/contests/gplt/L1-033 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standar ...
- CCCC L2-002. 链表去重
https://www.patest.cn/contests/gplt/L2-002 模拟一个链表的去重操作 题解:别模拟了,直接用内置的list和map.关于输出的地址,直接用pair存地址和值,输 ...
- iOS安装包重签笔记
https://blog.csdn.net/skylin19840101/article/details/60583893
- Python日期格式化知识
Python中日期格式化是非常常见的操作,Python 中能用很多方式处理日期和时间,转换日期格式是一个常见的功能.Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时 ...
- SQL Server查询时添加一列连续的自增列
SQL Server查询时添加一列连续的自增列 在SQL Server数据库中表信息会用到Identity关键字来设置自增列.但是当有数据被删除的话,自增列就不连续了.如果想查询出这个表的信息,并添加 ...
- vue-scroller的使用 实现下拉刷新 上拉加载初始效果
安装vue-scroller npm i vue-scroller -D 在main.js中: import VueScroller from 'vue-scroller' Vue.use(VueSc ...
- requests库的get请求,带有cookies
(一)如何带cookies请求 方法一:headers中带cookies #coding:utf-8 import requests import re # 构建url url = 'http://w ...
- CentOS工作内容(三)配置网络IP地址
CentOS工作内容(三)配置网络IP地址 用到的快捷键 tab 自动补齐(有不知道的吗) ctrl+a 移动到当前行的开头(a ahead) ctrl+u 删除(剪切)此处至开始所有内容 vim 末 ...
- vue学习之四组件系统
vue.js既然是框架,那就不能只是简单的完成数据模板引擎的任务,它还提供了页面布局的功能.本文详细介绍使用vue.js进行页面布局的强大工具,vue.js组件系统. 一.Vue.js组件系统 每一个 ...