Django与多个数据库交互
定义数据库
在Django中使用多个数据库的第一步是告诉Django您将要使用的数据库服务器。
数据库可以有您选择的任何别名。但是,别名 default 有着特殊的意义。Django使用别名为 default 为默认数据库。
例如 settings.py 定义两个数据库,默认 PostgreSQL 数据库和名为 users 的 MySQL 数据库:
DATABASES = {
'default': {
'NAME': 'app_data',
'ENGINE': 'django.db.backends.postgresql',
'USER': 'postgres_user',
'PASSWORD': 's3krit'
},
'users': {
'NAME': 'user_data',
'ENGINE': 'django.db.backends.mysql',
'USER': 'mysql_user',
'PASSWORD': 'priv4te'
}
}
下面示例 settings.py 定义两个非默认数据库,并将 default 数据库故意空着:
DATABASES = {
'default': {},
'users': {
'NAME': 'user_data',
'ENGINE': 'django.db.backends.mysql',
'USER': 'mysql_user',
'PASSWORD': 'superS3cret'
},
'customers': {
'NAME': 'customer_data',
'ENGINE': 'django.db.backends.mysql',
'USER': 'mysql_cust',
'PASSWORD': 'veryPriv@ate'
}
}
同步数据库
#默认情况下使用 default 数据库, 在 default 数据库为空时不指定数据库会报错
python manage.py migrate #要使用特定的数据库, 就需要指定数据库
python manage.py migrate --database=users
手动选择数据库
在查询时可以调用 using() 手动选择数据库。
using() 接受一个参数要在其上运行查询的数据库的别名。例如:
>>> # 这将运行 'default' 数据库.
>>> Author.objects.all() >>> # 这个和上面也是一样的效果.
>>> Author.objects.using('default').all() >>> # 这个就会运行指定的 'other' 数据库.
>>> Author.objects.using('other').all()
若要将数据保存到指定的数据库;例如,若要将对象保存到 legacy_users 数据库,您可以使用这个:
my_object.save(using='legacy_users')
如果不指定using,save()方法将保存到由路由器分配的默认数据库中。
将对象从一个数据库移到另一个数据库
如果您已将实例保存到一个数据库,再使用 save(using=...)作为将实例迁移到新数据库。如果您不采取适当的步骤,这可能会产生一些意想不到的后果。
p = Person(name='Fred')
p.save(using='first')
p.save(using='second')
Person对象保存到first数据库时,p没有主键,因此Django发出SQLINSERT声明。这将创建一个主键,Django将主键分配给p;
当保存到 'second' 数据库上时,p已经有一个主键值,Django将尝试在新数据库中使用该主键。如果second数据库没有该主键值,那么就不会有任何问题,对象将被复制到新的数据库。但是,如果p的主键在second数据库中有对应的数据时,对应数据将被重写。
可以通过两种方式避免这种情况。首先,可以清除实例的主键:
p = Person(name='Fred')
p.save(using='first')
p.pk = None # 清除p的主键值
p.save(using='second') # 写入一个没有主键的p实例
或者使用force_insert来save(),以确保Django执行SQLINSERT:
p = Person(name='Fred')
p.save(using='first')
p.save(using='second', force_insert=True)
选择要删除的数据库
默认删除实例对象作用的数据库
u = User.objects.using('legacy_users').get(username='fred')
u.delete() #从 'legacy_users' 数据库中删除 'fred'
若要删除指定数据库的数据,传递 using 关键字,和 save() 类似。
例如,如果要把一个 user 从 legacy_users 数据库迁移到 new_users 数据库中,可以使用以下命令:
user_obj.save(using='new_users')
user_obj.delete(using='legacy_users')#删除指定数据库的数据
学习自用,欢迎大神评论、指正
详情见Django文档:
https://docs.djangoproject.com/en/2.1/topics/db/multi-db/
Django与多个数据库交互的更多相关文章
- Django视图,与数据库交互并返回数据
环境:python 2.7.13 数据库:sqlite3(Django自带) 在学习Django的时候,遇到了困难.大概就是取到数据库数据后一直不能转成json数据.最后终于自己琢磨解决了. 要点就 ...
- 循序渐进Python3(十二) --2-- web框架之django简单实现oracle数据库操作
在 Django 中构建 Oracle 数据库支持的 Web 应用程序 了解如何配置 Django 以便与 Oracle 数据库交互,并使用 ORM 进行数据库连接. 产能在软 ...
- Django开发笔记之数据库的设计
后台采用Django开发,可以体会到开发的便利之处,对于一个项目来说,首先最重要的是数据库的设计,那么在Django下数据库设计主要是如下步骤: 1,需求分析,这点子不用多说,而我也深刻体会到了没有原 ...
- Django开发基础----操作数据库
Django中对数据库的操作是由Models来完成的 Models是什么? 通常,一个Model对应数据库的一张数据表 Django中Models以类的形式出现 它包含了一些基本字段以及数据的一些行为 ...
- Django使用表单操作数据库
前言 目标:实现Django通过表单的GET方式和POST方式提交数据,并添加到数据库 . OS:win10 x64 Django:1.11.8 Python: 3.6 本文完整示例:完整示例: 虽然 ...
- HelloDjango 系列教程:第 04 篇:Django 迁移、操作数据库
文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 我们已经编写了博客数据库模型的代码,但那还只是 Python 代码而已,django 还没有把它翻译成数据库语言,因此实际上这 ...
- .NET应用程序与数据库交互的若干问题
我们知道,在应用程序中与数据库进行交互是一个比较耗时的过程,首先应用程序需要与应用程序建立连接,然后将请求发送到数据库,数据库执行操作,然后将结果集返回.所以在程序中,要尽量晚的与数据库建立连接,并且 ...
- 说说Java程序和数据库交互的乱码解决
本文就本人遇到的问题进行讲解 1.通过jdbc直连方式,连接Mysql数据库,从程序向数据库中写入数据出现的乱码解决方案. 当通过程序向Student表中写入一条数据时,写入数据库的内容会产生乱码. ...
- python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
python Django教程 之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...
随机推荐
- 随机算法瞎练BZOJ3237&3563&3569三倍经验题
随机方法真的好骚啊O(∩_∩)O~ 最早的时候miaom提出一个奇怪的东西: 判断一个数列中是否有0/1/2个数出现奇数次 对每个数赋一个随机权值,异或乱搞,对于判2的情况用一个(可能类似线性基的)方 ...
- 30道python真实面试题(搜集到的,看看其实都是基础)
1.一行代码实现1-100之间和 In [1]: sum(range(0,101)) Out[1]: 5050 2.如何在一个函数内部修改全局变量 利用global修改全局变量 In [2]: a = ...
- Jenkins执行yarn install报错:error An unexpected error occurred:"... ... :Unexpected end of JSON input"
解决方式: # cd /usr/local/n/versions/node/11.6.0/lib/(node的安装目录下) # rm -rf node_modules # yarn cache cle ...
- vue之store中属性更新用法
//1.首先定义store对象下的属性 state: { data:'测试数据' } // 2.定义更改data数据的方法 mutations: { updatedata(state, p) { st ...
- nodejs模块学习: webpack
nodejs模块学习: webpack nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的基础不稳固,需要开发者创造大量的轮子来解决现实 ...
- AJPFX辨析continue与break的区别
1.break : (1).结束当前整个循环,执行当前循环下边的语句.忽略循环体中任何其它语句和循环条件测试.(2).只能跳出一层循环,如果你的循环是嵌套循环,那么你需要按照你嵌套的层次,逐步使用br ...
- Java并发(二):基础概念
并发编程的第二部分,先来谈谈发布(Publish)与逸出(Escape); 发布是指:对象能够在当前作用域之外的代码中使用,例如:将对象的引用传递到其他类的方法中,对象的引用保存在其他类可以访问的地方 ...
- JS和jquery获取各种屏幕的宽度和高度的代码
Javascript: 网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document ...
- 在Office 365 添加就地保留用户邮箱
基于客户需求,要求将用户批量添加到Office 365中的现有就地保留.如您所了解的,我们可以通过Exchange在线图形用户GUI界面完成,也可以通过PowerShell完成. 要将用户批量添加到O ...
- basic ,fundamental ,extreme ,utmost和radical.区别
basic 普通用词,指明确.具体的基础或起点.fundamental 书面用词,不如basic使用广泛,侧重指作为基础.根本的抽象的事物.radical 着重指事物的根本或其来源.下面是extrem ...