Django中一个项目使用多个数据库
在django项目中, 一个工程中存在多个APP应用很常见. 有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接。
参考:http://blog.csdn.net/songfreeman/article/details/70229839
1. 修改项目的 settings 配置
在 settings.py
中配置需要连接的多个数据库连接串
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'ora1': { # 配置第二个数据库节点名称
'ENGINE': 'django.db.backends.oracle',
'NAME': 'devdb',
'USER': 'hysh',
'PASSWORD': 'hysh',
'HOST': '192.168.191.3',
'PORT': '1521',
},
}
2. 设置数据库的路由规则方法
在 settings.py
中配置 DATABASE_ROUTERS
DATABASE_ROUTERS = ['Prject.database_router.DatabaseAppsRouter']
Project: 建立的django项目名称(project_name)
database_router: 定义路由规则database_router.py
文件名称, 这个文件名可以自己定义
DatabaseAppsRouter: 路由规则的类名称,这个类是在database_router.py
文件中定义
3. 设置APP对应的数据库路由表
每个APP要连接哪个数据库,需要在做匹配设置,在 settings.py
文件中做如下配置:
DATABASE_APPS_MAPPING = {
# example:
# 'app_name':'database_name',
'report': 'ora1',
'admin': 'defualt',
'regs': 'defualt',
}
以上的report, regs是项目中的 APP名,分别指定到 ora1, default的数据库。
为了使django自己的表也创建到你自己定义的数据库中,你可以指定 : admin, auth, contenttypes, sessions 到设定的数据库中,如果不指定则会自动创建到默认(default)的数据库中.
4. 创建数据库路由规则
在项目工程根路径下(与 settings.py 文件一级)创建 database_router.py
文件:
from django.conf import settings DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING class DatabaseAppsRouter(object):
"""
A router to control all database operations on models for different
databases. In case an app is not set in settings.DATABASE_APPS_MAPPING, the router
will fallback to the `default` database. Settings example: DATABASE_APPS_MAPPING = {'app1': 'db1', 'app2': 'db2'}
""" def db_for_read(self, model, **hints):
""""Point all read operations to the specific database."""
if model._meta.app_label in DATABASE_MAPPING:
return DATABASE_MAPPING[model._meta.app_label]
return None def db_for_write(self, model, **hints):
"""Point all write operations to the specific database."""
if model._meta.app_label in DATABASE_MAPPING:
return DATABASE_MAPPING[model._meta.app_label]
return None def allow_relation(self, obj1, obj2, **hints):
"""Allow any relation between apps that use the same database."""
db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
if db_obj1 and db_obj2:
if db_obj1 == db_obj2:
return True
else:
return False
return None def allow_syncdb(self, db, model):
"""Make sure that apps only appear in the related database.""" if db in DATABASE_MAPPING.values():
return DATABASE_MAPPING.get(model._meta.app_label) == db
elif model._meta.app_label in DATABASE_MAPPING:
return False
return None def allow_migrate(self, db, app_label, model=None, **hints):
"""
Make sure the auth app only appears in the 'auth_db'
database.
"""
if db in DATABASE_MAPPING.values():
return DATABASE_MAPPING.get(app_label) == db
elif app_label in DATABASE_MAPPING:
return False
return None
5.原生sql 的使用:
def exc_sql(sql):
cursor = connections['ora1'].cursor()
# cursor = connection.cursor()
cursor.execute(sql)
result = cursor.fetchall()
return result
参考:https://docs.djangoproject.com/en/2.0/topics/db/sql/
6. Models创建样例
在各自的 APP 中创建数据表的models时,必须要指定表的 app_label 名字,如果不指定则会创建到 default
中配置的数据库名下,
如下:
在app01
下创建models
class Users(models.Model):
name = models.CharField(max_length=50)
passwd = models.CharField(max_length=100) def __str__(self):
return "app01 %s " % self.name class Meta:
app_label = "app01"
在app02
下创建models
class Users(models.Model):
username = models.CharField(max_length=100)
password = models.CharField(max_length=50)
age = models.IntegerField() def __str__(self):
return "app02 %s" % self.username class Meta:
app_label = "app02" class Book(models.Model):
user = models.ForeignKey("Users", on_delete=models.CASCADE)
bookname = models.CharField(max_length=100) def __str__(self):
return "%s: %s" % (self.user.username, self.bookname) class Meta:
app_label = "app02"
7. 生成数据表
在使用django的 migrate 创建生成表的时候,需要加上 –database 参数,如果不加则将 未 指定 app_label 的 APP的models中的表创建到default指定的数据库中,如:
将app01下models中的表创建到db01的数据库”db_01”中
./ manage.py migrate --database=db01
将app02下models中的表创建到db02的数据库”db_02”中
./ manage.py migrate --database=db02
将app03下models中的表创建到default的数据库”sqlite3”中
./ manage.py migrate
以上创建完成后,其它所有的创建、查询、删除等操作就和普通一样操作就可以了,无需再使用类似
models.User.objects.using(dbname).all()
这样的方式来操作
Django中一个项目使用多个数据库的更多相关文章
- eclipse中一个项目引用另一个项目的方法(申明:来源于网络)
eclipse中一个项目引用另一个项目的方法(申明:来源于网络) 地址:http://blog.csdn.net/a942980741/article/details/39990699
- 用django创建一个项目
首先你得安装好python和django,然后配置好环境变量,安装python就不说了,从配置环境变量开始 1.配置环境变量 在我的电脑处点击右键,或者打开 控制面板\系统和安全\系统 -> 左 ...
- Django中manger/QuerySet类与mysql数据库的查询
Django中的单表操作 1.精确查询 #查询的结果返回是容器Query Set的函数(Query Set模型类)# 1. all() 查询的所有的符合条件的结果,支持正向索引,支持索引切片,不 ...
- Eclipse中一个项目调用另一个项目的资源
如果一个项目A想要引用另一个项目B的资源的话,按照一下步骤进行设置: 右键点击项目A---->>>Build Path--->>>Configure Build P ...
- 微服务中一个项目install打包总是失败
在微服务的一个项目中install打包时总是报错如下: [INFO] Scanning for projects... [INFO] [INFO] -------------------------- ...
- 在django中使用orm来操作MySQL数据库的建表,增删改
多张表之间的三种关系:一对一,一对多,多对多 创建表 一对一 xx = models.OneToOneField(to='表明',to_field='字段名',on_delete=models.CAS ...
- Django 构建一个项目
一.创建django程序 终端命令:django-admin startproject fahaicmd IDE创建Django程序时,本质上都是自动执行上述命令 其他常用命令: python man ...
- eclipse中一个项目引用另一个项目的方法
我们在开发的时候,有时候需要把一个大的项目打散,尤其是现在微服务的架构很流行,一个大的项目往往被拆成很多小的项目,而有的项目作为公共工程被独立出来,比如有个工程专门提供各种Util工具类,有的工程专门 ...
- C# 在Visual Studio中一个项目有两个Main函数, 怎么设置哪个是入口?取代csc /main选项。
namespace ConsoleApp1{class Program{static void Main(string[] args){Console.WriteLine("Program& ...
随机推荐
- 在IIS7上导出所有应用程序池的方法批量域名绑定(网站绑定)
资料来源: http://www.2cto.com/os/201410/341882.html 一点经验:导出配置文件后,建议打开看看,如果有需要调整的需要做修改. 在IIS7+上导出所有应用程序池的 ...
- 利用git 进行多人协作开发
现在,大部分项目都是用 git 来管理代码的,但当项目变大.多人协作时,git 的使用就变得复杂了,这时就需要在 git 使用的流程上来思考如何更优的使用 git. 对于大部分 web 项目而言,并不 ...
- pilicat-dfs 霹雳猫-分布式文件系统
pilicat-dfs 霹雳猫-分布式文件系统 一种可以将网站图片或上传的文件,进行分布式存放的服务,可自动复制到多台物理机器,可满足高可用和负载均衡 已编译好的程序包 http://git.osch ...
- 使用Mybatis-Generator自动生成Dao、Model、Mapping
Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由于手动书写很容易出错,我们可以利用Mybatis-Generator来帮我们自动生成文件. 1.相关文 ...
- CentOS 7下PXE+Kickstart无人值守安装操作系统
1.简介 1.1. 什么是PXE PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支 ...
- Kafka原理总结
Kafka Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实 ...
- 框架源码系列九:依赖注入DI、三种Bean配置方式的注册和实例化过程
一.依赖注入DI 学习目标1)搞清楚构造参数依赖注入的过程及类2)搞清楚注解方式的属性依赖注入在哪里完成的.学习思路1)思考我们手写时是如何做的2)读 spring 源码对比看它的实现3)Spring ...
- Web重温系列(三):OracleDependency实现监听数据库变化
有个小项目(后来由另一个小组以Java开发了),内容是监控一个Oracle数据库.如果其中一个表A有数据变动,则需要将相关内容重组后通过接口发送给B. 通常的解决办法是定时查询,时间间隔可以小一点,还 ...
- Linux 开机启动顺序_005
***了解Linux开机启动顺序之前先了解一下Linux运行级别,通过inittab配置文件查看运行级别的定义: [root@oldboy ~]# cat /etc/inittab # Default ...
- MySQL 5.7.14安装说明,解决服务无法启动
http://jingyan.baidu.com/article/f54ae2fc0affca1e92b84999.html http://www.myexception.cn/mysql/51431 ...