1、定义数据库

  1. django项目中, 一个工程中存在多个APP应用很常见;有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接。
    Djangosetting中使用DATABASES设置定义数据库,可以将数据库映射到特定的别名字典中;DATABASES定义的是要给嵌套字典,该设置必须配置default默认数据库。默认使用SQLite进行单一数据库设置:
  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.sqlite3',
  4. 'NAME': 'mydatabase',
  5. }
  6. }

如不使用默认数据库定义可以将默认配置为空字典形式:

  1. 'default':{}

(1) DATABASES内部选项:

ATOMIC_REQUESTS:为True时数据库事务包装每个视图,默认为False

AUTOCOMMIT:为False时禁用Django事务管理,默认为True

ENGINE:设置数据库类型

  1. 'django.db.backends.postgresql'
  2. 'django.db.backends.mysql'
  3. 'django.db.backends.sqlite3'
  4. 'django.db.backends.oracle'

HOST:指定连接的主机名或ip地址,如果使用(‘/’)正斜杠开头则通过套接字连接:

  1. 'HOST':'127.0.0.1' #TCP套接字连接
  2. 'HOST':'/var/run/mysql' #UNIX套接字

NAME:制定使用的数据库名,对于SQLite它是指定数据库文件的路径,在window上也要使用正斜杠。

  1. 'NAME':'databasename'
  2. 'NAME':'C:/user/mysite/sqlite3.db'

CONN_MAX_AGE:数据库连接的生命周期,默认为0请求结束时关闭数据库,设置为None无限持久连接。

OPTIONS:链接到数据库时使用的额外参数,可用参数因数据库类型而异。

  1. 'OPTIONS':{'read_default_file':'path/to/my.cnf',} #优先于NAME,USER,PASSWORD,HOST,PORT
  2.  
  3. #设置mysql启用严格模式
  4. 'OPTIONS':{'init_command':"SET sql_mode='STRICT_TRANS_TABLES'"}

PASSWORD:设置密码,不与SQLite一起使用

PORT:指定端口

TIME_ZONE:设置时区

DISABLE_SERVER_SIDE_CURSORS:True时禁用服务器端游标

USER:链接用户名

TEST:测试数据库

(2)自定义数据库

  1. #自定义两个mysql数据库映射到db1和db2上
  2. 'db1':{
  3. 'ENGINE': 'django.db.backends.mysql',
  4. 'NAME': 'db1',
  5. 'USER': 'root',
  6. 'PASSWORD': '123.com',
  7. 'HOST': '172.16.32.133',
  8. 'PORT': '',
  9. 'OPTIONS': {
  10. 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
  11. }, #mysql使用严格模式,不指定会有警告信息
  12. },
  13. 'db2':{
  14. 'ENGINE': 'django.db.backends.mysql',
  15. 'NAME': 'db2',
  16. 'USER': 'root',
  17. 'PASSWORD': '123.com',
  18. 'HOST': '172.16.32.133',
  19. 'PORT': '',
  20. 'OPTIONS': {
  21. 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
  22. }

如果访问没有在DATABASES中定义的数据库,Django会报:django.db.utils.ConnectionDoesNotExist 异常。

2、同步数据库

migrate管理命令会同时在每一个数据库上运行,默认情况下它在default数据库上运行 ,可以通过选项 --database来指定需要同步的数据库。如不指定会同步到default数据库上。

迁移同步命令:

makemigrations:根据简称到的变化创建新的迁移。

migrate:将模型和迁移数据同步到数据库中。

通过上面的列子,将每个应用程序同步到特定的数据库:

  1. #python manage.py migrate #同步默认数据库
    #python manage.py migrate --database=db1
  2. #python manage.py migrate --database=db2

多个数据库导出:

  1. python manage.py dumpdata app01 --database=db1 > app1_fixture.json
  2. python manage.py dumpdata app02 --database=db2 > app2_fixture.json
  3. python manage.py dumpdata auth > auth_fixture.json

多个数据库导入:

  1. python manage.py loaddata app1_fixture.json --database=db1
  2. python manage.py loaddata app2_fixture.json --database=db2

3、自动数据库路由

使用多个数据库时最简单的方法是设置数据库路由方案,以保证对象对原始数据库的“粘性",默认所有的查询都会返回到default数据库中。

数据库路由器是一个最多提供四种方法的类:

db_for_read(model,**hints)  :应用于读取类型对象的数据库模型,如果数据库提供附加信息会在hints字典中提供,最后如果没有则返回None

db_for_write(model,**hints):应用于写入类型对象的数据库模型,hints字典提供附加信息,如果没有则返回None

allow_relation(obj1,obj2,**hints):外键操作,判断两个对象之间是否是应该允许关系,是返回True,否则返回False,如果路由允许返回None

allow_migrate(db,app_label,model_name=None,**hints):db确定是否允许在具有别名的数据库上运行迁移操作,操作运行返回True,否则返回False,或者返回None,如果路由器没有意见。

app_label:位置参数是正在迁移的应用程序的标签。

model_name:多个迁移操作设置模型的值,如:model._meta.app_label

(1)定义数据库路由方法类

在项目工程根路径下(与 settings.py 文件一级)创建数据库路由表,app应用会根据指定的路由选择数据库:

app01,app02分别使用db1和db2数据库:

  1. #!/usr/bin/env python
  2. #coding:utf8
  3. from django.conf import settings
  4.  
  5. DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING #在setting中定义的路由表
  6.  
  7. class DatabaseAppsRouter(object):
  8. def db_for_read(self, model, **hints):
  9. if model._meta.app_label in DATABASE_MAPPING:
  10. return DATABASE_MAPPING[model._meta.app_label]
  11. return None
  12.  
  13. def db_for_write(self, model, **hints):
  14.  
  15. if model._meta.app_label in DATABASE_MAPPING:
  16. return DATABASE_MAPPING[model._meta.app_label]
  17. return None
  18.  
  19. def allow_relation(self, obj1, obj2, **hints):
  20.  
  21. db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
  22. db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
  23. if db_obj1 and db_obj2:
  24. if db_obj1 == db_obj2:
  25. return True
  26. else:
  27. return False
  28. return None
  29.  
  30. def allow_syncdb(self, db, model):
  31.  
  32. if db in DATABASE_MAPPING.values():
  33. return DATABASE_MAPPING.get(model._meta.app_label) == db
  34. elif model._meta.app_label in DATABASE_MAPPING:
  35. return False
  36. return None
  37.  
  38. def allow_migrate(self, db, app_label, model_name=None, **hints):
  39. if db in DATABASE_MAPPING.values():
  40. return DATABASE_MAPPING.get(app_label) == db
  41. elif app_label in DATABASE_MAPPING:
  42. return False
  43. return None

(2)使用路由数据库

在setting.py中配置DATABASE_ROUTERS指定自由路由文件:

  1. #test_django为项目名,database_router为路由文件名,DatabaseAppsRouter为路由中创建的类名
  2.  
  3. DATABASE_ROUTERS = ['test_django.database_router.DatabaseAppsRouter']

在setting.py中DATABASE_ROUTERS下面设置app与数据库匹配路由表,采用字典方式app名对应数据库映射名:

  1. DATABASE_APPS_MAPPING = {
  2. 'app01':'db1',
  3. 'app02':'db2',
      
  4. }

(3)生成数据表并同步数据

分别在app01和app02下创建model类,用于生成数据表:

app01:

  1. from django.db import models
  2.  
  3. # Create your models here.
  4. class ap1(models.Model):
  5. username = models.CharField(max_length=30)
  6. class Meta:
  7. #app_label = 'app02' #如果指定将在app02对应的数据库下创建数据表
  8.  
  9. class ap2(models.Model):
  10. first_name = models.CharField(max_length=50)
  11. last_name = models.CharField(max_length=50)
  12. birth_date = models.DateField()

app02:

  1. from django.db import models
  2.  
  3. class ap3(models.Model):
  4. app2_name = models.CharField(max_length=50)
  5. sex = models.CharField(max_length=50)
  6. data = models.DateField()
  7.  
  8. class ap4(models.Model):
  9. app2 = models.CharField(max_length=50)
  10. sex1 = models.CharField(max_length=50)
  11. data1 = models.DateField()
  12. class Meta:
  13. db_table = 'mytable' #自定义表名称

migrate管理命令一次只能操作一个数据库,默认操作default数据库,使用--database指定同步的数据库:

  1. #python manage.py migrate #生成表数据同步
  2. #python manage.py makemigrations #创建变动数据
  3. #python manage.py migrate --database=db1 #同步指定数据库
  4. #python manage.py migrate --database=db2

需要注意:在多个app分库时,必须指定每个app对应的数据库,否则在同步数据 库时将没指定的app模板都同步到同步数据库中。

4、手动选择数据库

使用using()指定查询的数据库的别名:

  1. >>> # So will this.
  2. >>> Author.objects.using('default').all()
  3.  
  4. >>> # This will run on the 'other' database.
  5. >>> Author.objects.using('other').all()

保存数据,Model.save()指定将数据保存到哪个数据库中:

  1. >>> my_object.save(using='legacy_users')
  2.  
  3. #会将数据保存到legacy_users数据库中,如不指定会保持到默认数据库中。
  1. >>> my_object.delete(using='legacy_users')
  1. #删除指定数据库

移动对象到另一个数据库时会发生主键冲突,可以使用obj.pk方法清除主键再保存对象。

  1. >>> p = Person(name='Fred')
  2. >>> p.save(using='first')
  3. >>> p.pk = None # Clear the primary key.
  4. >>> p.save(using='second') # Write a

--------------------------------------------------------------------------

python3之Django多数据库的更多相关文章

  1. Linux下安装Python3的django并配置mysql作为django默认数据库(转载)

    我的操作系统为centos6.5 1  首先选择django要使用什么数据库.django1.10默认数据库为sqlite3,本人想使用mysql数据库,但为了测试方便顺便要安装一下sqlite开发包 ...

  2. Python3:Django根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete'

    Python3:Django根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete' 一.分析 在 ...

  3. Python3:Django连接Mysql数据库时出错,'Did you install mysqlclient or MySQL-python?'

    Python3:Django连接Mysql数据库时出错,'Did you install mysqlclient or MySQL-python?' 一.原因 因为Python版本问题,MySQLdb ...

  4. python学习笔记--Django入门三 Django 与数据库的交互:数据建模

    把数据存取逻辑.业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller (MVC)模式.在这个模式中, Model 代表数据存取层,View 代表的是系统中 ...

  5. Linux下安装Python3和django并配置mysql作为django默认服务器

    我的操作系统为centos6.5 1  首先选择django要使用什么数据库.django1.10默认数据库为sqlite3,本人想使用mysql数据库,但为了测试方便顺便要安装一下sqlite开发包 ...

  6. windows下,python3安装django和mysql驱动

    1.安装python3和django (1)Python 下载地址:https://www.python.org/downloads/ (2)Django 下载地址:https://www.djang ...

  7. python3.4连接mysql数据库的方法

    python3.4连接mysql数据库的方法 发布时间:2014-08-04编辑:www.jbxue.com 本文介绍了python3.4连接mysql数据库的方法,在python3.4中不能用mys ...

  8. django 操作数据库--orm(object relation mapping)---models

    思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...

  9. Python3实现连接SQLite数据库的方法

    本文实例讲述了Python3实现连接SQLite数据库的方法,对于Python的学习有不错的参考借鉴价值.分享给大家供大家参考之用.具体方法如下: 实例代码如下: ? 1 2 3 4 5 6 7 8 ...

随机推荐

  1. 【POJ3045】Cow Acrobats(贪心)

    BUPT2017 wintertraining(16) #4 B POJ - 3045 题意 n(1 <= N <= 50,000) 个牛,重wi (1 <= W_i <= 1 ...

  2. bat 脚本处理windows 文件

    背景:以下脚本使用了导出文件列表.移动文件.复制文件.report 系统信息.分段执行的功能 主要针对在从事于Easeware公司中,对软件Bug中,所需文件的提取. 代码片段说明: cls ver ...

  3. 自学Python1.6-Centos内英文语法切换

    自学Python之路 自学Python1.6-Centos内中英文语法切换 测试采用是官方Centos7.0系统 1.添加中文输入法 打开设置---区域和语言--->在输入源最下面有一个 + 号 ...

  4. Java XML JSON 数据解析

    下面我们通过一段代码了解一下解析JSON格式数据的基本过程: 提示:使用JSON需要导入 JSON 相关的多个Jar文件 import net.sf.json.JSONObject; public c ...

  5. [hgoi#2019/2/16t2]friend

    题目描述 在一个遥远的国度里有n个人,每个人手上写着4个互不相同的数. 这个国度比较奇怪,如果两个人至少有一个数字相同,则他们是一对朋友. 现在这n个人按序号从左到右排成了一排,每个人都想知道在他左边 ...

  6. 关于Picasso load本地图片显示失败的探究

    今天测试找过来说图片不显示了,查了一下是Picasso加载本地图片没有显示,奇怪了,以前都是这样写为什么现在不行了,难道是Picasso有bug了,怀着激动的心情断点跟进去发现 Picasso所有lo ...

  7. 常用nginx rewrite重定向-跳转实例:

    1,将www.myweb.com/connect 跳转到connect.myweb.com rewrite ^/connect$ http://connect.myweb.com permanent; ...

  8. Linux安装-kickstart无人值守安装

    Linux安装-kickstart无人值守安装 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 大家做运维估计都避免不了时不时会去机房安装一台linux服务器,但是服务器启动的特别慢 ...

  9. 记录一次nginx的upstream的配置信息

    nginx的upstream的配置信息 upstream qq.xiaoyu.cn { server 192.168.1.139:80 max_fails=3 fail_timeout=30s; se ...

  10. 内联函数 —— C 中关键字 inline 用法解析

    一.什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗. 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数. 栈空间就是指放 ...