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 ...
随机推荐
- TensorFlow 的softmax实例理解
对于理论,简单的去看一下百度上的说明,这里直接上实例,帮助理解. # softmax函数,将向量映射到0-1的范围内,P=exp(ax)/(sum(exp(a1x)+exp(a2x)+...)) in ...
- Crontab '2>&1 &' 含义
Crontab '2>&1 &' 含义 - dosttyy - 博客园 https://www.cnblogs.com/dosttyy/p/4810026.html
- 让WIN7桌面显示IE图标
首先新一个文本文件,将以下代码复制到新建文档中.然后保存为IE.reg,右键以管理员权限运行.此时,注册表注册成功.LOOK,IE图标出来了 Windows Registry Editor Versi ...
- 共享访问在.NET中的编程实现
转载:http://blog.csdn.net/zhzuo/article/details/1732937 共享访问在.NET中的编程实现 发布日期:2007-08-08 | 更新日期:2009-03 ...
- 修改mac地址(物理地址)
查询原有的MAC地址(物理地址) cmd ipconfig /all 修改MAC地址(物理地址) 修改MAC地址后,再查看MAC地址: cmd ipconfig /all 修改成功.
- visio 的使用方法
1:往visio中添加商务图形和形状的方法.例如饼状图. 文件>形状>商务>图表和图形>绘制图表形状 2:visio 画半弧形,用铅笔 3: visio 画的图形,如果想要和v ...
- SqlAlchemy个人学习笔记完整汇总-转载
使用 sqlalchemy 有3种方式: 方式1, 使用raw sql; 方式2, 使用SqlAlchemy的sql expression; 方式3, 使用ORM. 前两种方式可以统称为 core ...
- pem转cer
openssl x509 -inform pem -in fullchain.pem -outform der -out fullchain.cer
- 4.keras实现-->生成式深度学习之DeepDream
DeepDream是一种艺术性的图像修改技术,它用到了卷积神经网络学到的表示,DeepDream由Google于2015年发布.这个算法与卷积神经网络过滤器可视化技术几乎相同,都是反向运行一个卷积神经 ...
- GreenPlum安装greenplum-cc-web监控
一. GreenPlum集群安装环境 由虚拟机搭建的一台master两台segment. 二.安装前准备 1) 所需安装包 GreenPlum监控安装包: greenplum-cc-web-3.0.2 ...