注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

郁夫的博客

我爱你们,只是你们不知道!

 
 
 

日志

 
 
 
 

Django 1.2 多数据库(1)-译-原  

2011-11-02 14:02:32|  分类: Django |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

这个标题手册描述Django支持多个数据库的交互。大多数的Django程序都假定你和一个数据库交互。如果你想和多个数据库交互,

你需要一些额外的步骤。

定义你的数据库

第一步是告诉Django你使用的不只是一个数据库。这个是在setting中的DATABASES设定。这个设定映射数据库别名,指定通过

Django连接到特定的数据库。这个设定用内置的字典在DATABASES文档有完整的描述。

你可以为数据库选择任何的别名。然而,别名default有特别的意义,当没有其他数据库被选择时,Django将使用default别名的数据库。

如果你没有一个default数据库,你需要当心总是指定你要使用的数据库。

下面的是一个在settings.py中定义两个数据库的例子片段 —— 一个默认的PostgreSQL数据库和一个名为users的MySql数据库。

DATABASES = {
    'default': {
        'NAME': 'app_data',
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'USER': 'postgres_user',
        'PASSWORD': 's3krit'
    },
    'users': {
        'NAME': 'user_data',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'priv4te'
    }
}

如果你尝试访问一个没有在DATABASES 中定义的数据库,Django将产生一个 django.db.utils.ConnectionDoesNotExist

的例外。


同步你的数据库

syncdb 管理命令每次只操作一个数据库。默认的是操作default数据库,但它提供了一个 --database 参数,你可以告诉syncdb同步

不同的数据库。因此如果同步我们例子里的所有数据库的所有models,我们需要做:

$ ./manage.py syncdb
$ ./manage.py syncdb --database=users

如果你不想每个应用同步特定的数据库,你可以定义一个  database router  为特定的models实现一个可用的强制策略。

另一方面,如果你想细粒度的控制同步,你可以全部或部分用sqlall为特定的应用直接输出到database提示,像这样:

$ ./manage.py sqlall sales | ./manage.py dbshell


使用其他管理命令

其他的 django-admin.py 命令和数据库的交互操作和syncdb使用同样的方法。它们总是每次操作一个数据库,使用 --database参数

控制使用哪一个数据库。

自动的数据路由

最简单的方法是使用多数据库建立一个数据数据库路由架构。默认的路由架构确保对象保留对原始数据库的粘着(例如:一个从 foo 数

据库取得的对象,将被存贮在同一个数据库)。默认的路由架构确保如果数据库没有指定,所有的查询是回退到默认的数据库。

你不用对默认的路由架构做任何事情,它是开箱即用(out of the box),被每个Django项目提供。然而,如果你想实现跟有趣的数据库分配行为,你可以定义和安装你自己的数据库路由。

数据库路由

一个数据库路由是一个类,提供4个方法:

db_for_read(model, **hints)
      建议从所列model中做读取操作时使用。
      如果一个数据库操作提供了可以帮助选择数据库的附加信息,它将提供在一个 hints 字典里。关于可利用的 hints 的细节在 hint 说明
      提供。如果没有建议的话,将返回 None。
 
db_for_write(model, **hints)
       建议从所列model中做写入对象操作时使用。
       如果一个数据库操作提供了可以帮助选择数据库的附加信息,它将提供在一个 hints 字典里。关于可利用的 hints 的细节在 hint 说
       明提供。如果没有建议的话,将返回 None。
 
allow_relation(obj1, obj2, **hints)
       如果 obj1和obj2之间允许关连返回 True ,如果关连被阻止则返回 False,或者返回 None 如果路由没有判定。这是一个十足的确
       认操作,在使用外键和多对多操作时确认对象之间是否允许关连。
 
allow_syncdb(db, model)
       确定 model是否可以和别名为db的数据库同步。如果可以同步返回True,如果不能同步返回False,或者返回None如果路由没有界
       定。 这个方法可以确定model在特定的数据库上是否有效。

 一个路由可能不会提供所有这些方法-省略他们中的一个或多个。如果一个方法被省略,Django 在执行相关检查时将跳过路由。

hints

hints接收数据库路由能够使用哪个数据库。

现在,hints作为一个实体(instance)提供,一个可以联系读和写操作的对象实体正在进行中。这意味着实体可以被存贮,或者它可以被

追加到一个多到多关系中。在有些状况,根本没有实体hint提供。路由检查存在的实体hint,而且确认hint可以被用来修改路由的行为。

  评论这张
 
阅读(980)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017