Django中的多数据库支持

11

我从一个论坛上得知Django在较低级别上添加了多数据库支持,但高级别的API尚未添加。

请问有人可以告诉我如何在Django中实现多个数据库连接。

有人知道Django何时会完全/正式支持多个数据库连接吗?

10个回答

9
如果您只需要多个连接,则可以像这样做:
from django.db import load_backend
myBackend = load_backend('postgresql_psycopg2') # or 'mysql', 'sqlite3', 'oracle'
myConnection = myBackend.DatabaseWrapper({
    'DATABASE_HOST': '192.168.1.1',
    'DATABASE_NAME': 'my_database',
    'DATABASE_OPTIONS': {},
    'DATABASE_PASSWORD': "",
    'DATABASE_PORT': "",
    'DATABASE_USER': "my_user",
    'TIME_ZONE': "America/New_York",})
# Now we can do all the standard raw sql stuff with myConnection.
myCursor = myConnection.cursor()
myCursor.execute("SELECT COUNT(1) FROM my_table;")
myCursor.fetchone()

1
当我在谷歌上找到这个答案时,因为它正是我所需要的,所以我点了赞。 - Charles Hooper

6

4

3
如果你阅读了django-dev上关于这个主题的许多(很多)线程,你会发现看起来简单的东西实际上并不是那么简单。如果你选择一个单一的用例,那么它看起来很容易,但是一旦你开始以任何方式进行泛化,你就会遇到麻烦。
以上述引用的线程为例,当你说“多个数据库”时,你指的是以下哪些内容?
所有DB都在同一台机器上,使用相同的引擎。
所有DB都在同一台机器上,使用不同的引擎(例如MySQL + PostgreSQL)。
一台主DB和N个只读从DB在不同的机器上。
将表分片跨越多个DB服务器。
你需要:
跨DB的外键
跨机器和/或引擎的JOINs
等等等等。
像Django这样的流畅ORM的问题之一是它在漂亮的涂装下隐藏了所有这些混乱的细节。要继续做到这一点,但是要添加以上任何内容,则不容易。

我明白这是一项非常复杂的工作。 但是当应用程序变得庞大时,Django可能只能用于简单的Web应用程序,必须将数据分割到多个数据库服务器(分片)中。开发人员如何处理这种情况? - codebreak
在所有的多数据库问题中,分片可能是最应用程序特定的,因此最难产生通用解决方案。您知道有哪些ORM可以提供这个问题的通用解决方案吗? - Peter Rowell

2

Eric Florenzano写了一篇非常好的博客文章,可以让您在Django中轻松支持多个数据库

它首先创建一个新的自定义管理器,允许您指定数据库设置。


根据Eric的示例修改全局设置对象并不是线程安全的事情。看起来,可能更低级别的连接API已经改变,允许传递设置,这将使其线程安全。 - Joe Holloway

2

多数据库可供选择

我们总是需要一个名为"default"的数据库,其他名称由您自行决定。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mupltiple_datab_app1',                     
        'USER': 'root',                     
        'PASSWORD': 'admin',                  
        'HOST': "",                      
        'PORT': "",                     
    },
    'user1':{
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'mupltiple_datab_app2',                      
        'USER': 'root',                     
        'PASSWORD': 'admin',                  
        'HOST': "",                        
        'PORT': "",  

    },
    'user2':{
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'mupltiple_datab_app3',                      
        'USER': 'root',                     
        'PASSWORD': 'admin',                  
        'HOST':"" ,                     
        'PORT': "" ,  

    }
}

同步到一个特定的数据库

manage.py syncdb --database=user1

1

0

0

如果您的所有数据库使用相同的引擎,那么Eric Florenzano的方法效果很好。但是,如果您有不同的引擎(例如我的情况下是Postgres和MSSQL),则会在ORM代码深处遇到许多问题(例如models/sql/where.py使用默认连接的SQL语法)。

如果您需要使其工作,您应该等待Alex Gaynor的MultiDB项目,该项目计划在Django 1.2中发布。


0

我认为你需要采用“原始SQL”这种方式。
请看这里:http://docs.djangoproject.com/en/dev/topics/db/sql/

你需要一个到其他数据库的“连接”, 如果你查看django/db/__init__.py大约在第39行(在我的版本中..)

connection = backend.DatabaseWrapper(**settings.DATABASE_OPTIONS)

试着从那里开始..
P.S. 我并没有真正尝试过这个或者任何东西..只是试图指出解决你问题的一般方向。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接