django中的多个数据库支持

时间:2008-11-06 09:39:21

标签: python django database-connection

在某个论坛上,我发现Django在较低级别添加了多个数据库支持,但是尚未添加更高级别的apis。

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

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

10 个答案:

答案 0 :(得分: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 :(得分:6)

答案 2 :(得分:4)

我在其上看到的最新讨论是在Proposal: user-friendly API for multi-database support django-developers线程中,该线程还有一个在原始消息中使用Managers使用多个数据库的方法示例。

答案 3 :(得分:3)

如果您在django-dev中阅读了关于此主题的众多(许多)线程中的一些,您将看到看起来的内容是直截了当的,不是。如果您选择一个用例,那么它看起来很简单,但只要您开始以任何方式进行概括,就会开始遇到麻烦。

要使用上面引用的线程作为示例,当您说“多个数据库”时,您在谈论以下哪个?

  • 所有数据库位于同一台机器下的同一台机器上。
  • 同一台机器上的所有数据库,不同的引擎(例如MySQL + PostgreSQL)
  • 一台主机DB,在不同的机器上有N个只读从机。
  • 跨多个数据库服务器对表进行分片。

你需要:

  • 跨DB的外键
  • 跨机器和/或引擎加入
  • 等。等

像Django这样光滑的ORM的一个问题是它在一个漂亮的油漆工作下隐藏了所有这些混乱的细节。要继续这样做,但要添加以上任何一项,都不容易(tm)。

答案 4 :(得分:2)

Eric Florenzano撰写了一篇非常好的博客文章,允许您在Easy MultipleDatabase Support for Django获得一些多数据库支持。

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

答案 5 :(得分:1)

答案 6 :(得分:1)

可供选择的多个数据库

我们总是需要一个命名默认值,其余的名称由您决定。

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

答案 7 :(得分:0)

我认为你将不得不求助于“原始sql”..有点事...... 看这里:http://docs.djangoproject.com/en/dev/topics/db/sql/

您需要与其他数据库建立“连接”, 如果你看一下第39行django/db/__init__.py(在我的版本中......)

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

试着从那里拿走它。
附:我还没有真正尝试过这个或任何事情......只是想指出我认为可以解决你的问题的大方向。

答案 8 :(得分:0)

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

如果你需要这个,你应该等待Alex Gaynor计划用于Django 1.2

的MultiDB项目

答案 9 :(得分:0)

从Django 1.2开始,它将支持多个数据库。请参阅:http://docs.djangoproject.com/en/dev/topics/db/multi-db/ 版本1.2现在处于测试阶段